Определить сенсорную область на масштабированном изображении в Android - PullRequest
0 голосов
/ 15 января 2012

Я уже задавал вопросы, связанные с этим, но думаю, что неправильно сформулировал свою цель.

Что у меня есть: пользовательский ImageView, который отображает графику и определяет несколько сенсорных областей в виде прямоугольников внутри изображения.Моя проблема - масштабирование.Я хочу определить сенсорную область изображения на основе его фактического разрешения в растровом файле, но перевести эти координаты, чтобы прямоугольник покрывал ту же область на масштабированном изображении.

Это то, что я получил до сих пор: когда создается представление, вычислите отношение фактических размеров к масштабированным

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Drawable pic=this.getDrawable();
int realHeight= pic.getIntrinsicHeight();   
int realWidth=pic.getIntrinsicWidth();
int scaledHeight=this.getHeight();
int scaleWidth=this.getWidth();
heightRatio=(float)realHeight/scaledHeight;
widthRatio=(float)realWidth/scaleWidth;
}

Теперь я хочу взять координаты, которые определяют прямоугольник(s) на исходном (немасштабированном) изображении и нарисуйте этот прямоугольник (и) в той же области изображения, но с учетом масштаба:

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p=new Paint();
p.setStrokeWidth(1);
p.setColor(Color.BLUE);
for (HotSpot h: spots)
{
//Each hotspot has a rectangle defined in reference to the actual size of the image
Rect old=h.getRect();
float offsetLeft=old.left+(old.left*widthRatio);
float offsetTop=old.top+(old.top*heightRatio);
float offsetRight=old.right+(old.right*heightRatio);
float offsetBottom=old.bottom+(old.bottom*widthRatio);
RectF nRect=new RectF(offsetLeft,offsetTop,offsetRight,offsetBottom);
canvas.drawRect(nRect,p);

 } 

Результаты "в парке мячей""но не совсем точно.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 15 января 2012

Вы можете попробовать это решение:

  • Получить плотность экрана
  • Получить высоту изображения (или ширину)
  • Разделите высоту (или ширину) на плотность, чтобы получить длину в дюймах
  • Разделите координату на длину в дюймах, чтобы получить связь между координатой и изображением, которая не зависит от эффективного размера изображения
  • Если вам нужно нарисовать одну и ту же точку на разномасштабном изображении, умножьте последний результат на длину в дюймах второго изображения (которое вы получите, используя те же операции, что перечислены выше)

Пример: На первом изображении:

float density = getResources().getDisplayMetrics().density;
int width = getWidth();
float inchesLength = width/density;
float scaledXCenter = xCenter / inchesLength;

На том же изображении с другим масштабом:

float density = getResources().getDisplayMetrics().density;
int width = getWidth();
float inchesLength = width/density;
float restoredXCenter = scaledXCenter * inchesLength;
...