2013-04-19 2 views
1

У меня есть классический ImageView, который изменен для его родителя с match_parent по обеим осям и scaleType равен fitCenter.Сенсорные координаты в центрированном и масштабированном ImageView

Screenshot

координаты, которые я получаю из-за onTouch события, однако, по сравнению с пределами ImageView. Как я могу преобразовать их в соответствие с границами самого изображения?

UPDATE

Я закончил тем, что делал это вручную. Это в Scala, но, возможно, легко перевести на Java:

// Long press on the screen adds a new interaction at that position 
screenView onTouch { 
    (v: View, ev: MotionEvent) => { 
    // Create the image transformation matrix 
    val m = screenView.getImageMatrix 
    val d = screenView.getDrawable 
    val drawableRect = new RectF(0, 0, d.getIntrinsicWidth, d.getIntrinsicHeight) 
    val viewRect = new RectF(0, 0, screenView.getWidth, screenView.getHeight) 
    m.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER) 
    m.invert(m) 

    // Convert the points inside the image 
    val points = Array(ev.getX, ev.getY) 
    m mapPoints points 

    // Compute normalized coordinates 
    current_x = points(0)/d.getIntrinsicWidth 
    current_y = points(1)/d.getIntrinsicHeight 

    // Only continue if we touched inside the image 
    !(current_x >= 0 && current_x <= 1 && 
     current_y >= 0 && current_y <= 1) 
    } 
} 

ответ

0

Вы можете вычислить его математически.

Рассчитать соотношение между высотой & и шириной изображения, а затем рассчитать фактическую ширину изображения, как показано на рисунке.

Вычитаем фактическую ширину изображения из ширины изображения и разделим на две части.

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

+0

Я думал, что в Android API будет метод. Вы знаете что-нибудь? Если нет, неважно, я сделаю это вручную. Но я бы предпочел что-то более общее ... –

+0

Хорошо, спасибо в любом случае, см. Обновленный вопрос о том, как я это сделал;) –

+0

Извините, я не знаком с каким-либо таким API. – tbkn23

Смежные вопросы