Определить сенсорную область на масштабированном изображении в Android

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

Что у меня есть: пользовательский 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;
}

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

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);

 } 

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


person David Hamilton    schedule 15.01.2012    source источник


Ответы (1)


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

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

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

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;
person Vincenzo Pii    schedule 15.01.2012