Android: MotionEvent.getY () возвращает искомые значения - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь определить, касается ли пользователь нарисованного растрового изображения в ImageView ...

    mCanvasImageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            //get coordinates
            float x = event.getX();
            float y = event.getY();

            //calculate Bitmap's drawn width and height 
            int drawnBitmapWidth;
            int drawnBitmapHeight;
            int imageViewWidth = mCanvasImageView.getWidth();
            int imageViewHeight = mCanvasImageView.getHeight();
            int bitmapWidth = mCanvasImageView.getDrawable().getIntrinsicWidth();
            int bitmapHeight = mCanvasImageView.getDrawable().getIntrinsicHeight();
            if (imageViewHeight * bitmapWidth <= imageViewWidth * bitmapHeight) {
                drawnBitmapWidth = bitmapWidth * imageViewHeight / bitmapHeight;
                drawnBitmapHeight = imageViewHeight;
            } else {
                drawnBitmapHeight = bitmapHeight * imageViewWidth / bitmapWidth;
                drawnBitmapWidth = imageViewWidth;
            }

            //determine if touch is in active area     
            if ( y > (0 + drawnBitmapHeight/2) && y < (imageViewHeight - drawnBitmapHeight/2) )
                Log.d(TAG, "IN ACTIVE Y REGION");
            else
                Log.d(TAG, "NOT IN ACTIVE Y REGION");

            //width is 1080, height is 1920
            //bitmap drawn width is 1080, height is 1080
            //active start 540 active end 1380

            return true;
        }

    });
}

Все значения рассчитаны правильно. ImageView заполняет экран и имеет размер 1080x1920. Растровое изображение выравнивается по центру в ImageView и имеет размер 1080x1080. Таким образом, активная область (в пересчете на y) составляет от 540 до 1380. События касания в этом диапазоне правильно определены как находящиеся в активной области. Однако ...

enter image description here

Когда я касаюсь, создается впечатление, что активная область начинается после растрового изображения и заканчивается перед ним. Я также заметил, что касание абсолютной верхней или нижней части экрана не возвращает ни 0, ни 1920, но аналогично смещает координаты y. Исходя из этого, я предполагаю, что getY () (и getRawY ()) как-то не точны, но я не могу определить, почему. Еще одно замечание: панель действий скрыта, а приложение полноэкранное без строки состояния.

...