Подтвердить что ты не робот

Получить координаты касания относительно вида (эквивалент ScreenToClient?)

У меня есть изображение, которое я показываю пользователю в своем приложении для Android.

Я хочу сказать, где они "касаются" изображения.

Я могу легко получить координаты экрана, выполнив OnTouchListener

 private OnTouchListener image_Listener = new OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            float x = event.getX();
            float y = event.getY();
            return true;
        }
        return false;
    }
};

Однако это абсолютные координаты. Мне действительно нужна функция, чтобы преобразовать это в координаты относительно представления.

Я немного поработал, но я ничего не могу поделать, кроме того, что я сам пытаюсь реализовать метод ScreenToClient.

Кто-нибудь знает о хорошем решении этого вопроса, или мне просто придется сворачивать самостоятельно?

Похоже, что этот метод будет доступен - вот почему я спрашиваю.

Спасибо всем за ваше время.

EDIT: Я не уверен, что координаты уже не относятся к представлению. Я мог бы поклясться, что координаты были абсолютными, но после некоторого возиться - у меня все работает так, как я ожидал. Извините за шум парней.

4b9b3361

Ответ 1

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

Если вы хотите получить координаты x/y затронутого вида относительно только самого себя, вы можете отнести левую координату с координатой экрана и верхней координатой от координаты y следующим образом:

private OnTouchListener image_Listener = new OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            float screenX = event.getX();
            float screenY = event.getY();
            float viewX = screenX - v.getLeft();
            float viewY = screenY - v.getTop();
            return true;
        }
        return false;
    }
};

При этом, если пользователь коснулся 40 x-пикселей вниз по экрану, но левое поле было установлено равным 10, тогда viewX будет 30. Если вы переместили представление вниз на 40 x-пикселей, и пользователь коснулся то же место в представлении, оно все равно будет 30.

Он становится немного более сложным, если вы включили дополнение в качестве дополнения в представлении, все еще считающемся представлением, даже если оно ничего не отображает.

EDIT:

Я должен указать, что то, что сказал Пьер, верно. Если вы коснетесь представления, он будет продолжать получать события касания до тех пор, пока палец не будет поднят, даже если вы перетащите палец за пределы обзора. Это означает, что ACTION_UP может получать координаты касания для вашего представления, которые не находятся в пределах.

Ответ 2

У меня была одна и та же проблема, и, пытаясь решить DeeV, я всегда получал 0 из методов getLeft() и getTop(). Поскольку изменение макета было не вариантом (потому что я думаю, что getTop/Left относительны только к родительскому представлению), мне нужно было выяснить, как получить абсолютную позицию представления.

Вот аналогичный подход с использованием getLocationOnScreen (location):

protected Point getRelativePosition(View v, MotionEvent event) {
    int[] location = new int[2];
    v.getLocationOnScreen(location);
    float screenX = event.getRawX();
    float screenY = event.getRawY();
    float viewX = screenX - location[0];
    float viewY = screenY - location[1];
    return new Point((int) viewX, (int) viewY);
}

Ответ 3

Коснитесь событийных координат относительно представления, которое принимает событие. Однако они не ограничены размером представления, так как пользователь может, очевидно, скользить вне представления в том же движении.

Пока не активируется ACTION_UP или ACTION_CANCEL, представление будет продолжать получать события движения, даже если указатель находится за пределами представления.

Вы уверены, что слушатель зарегистрирован в правом представлении?