Specific touch point on view in Accessibility mode (Talkback), Android

57 Views Asked by At

When talkback is ON, on single tap it will call dispatchHoverEvent() and on double tap it will call dispatchTouchEvent() then onTouchEvent().

When view is focused with blue box in talkback mode, getX() and getRawX() of onTouchEvent is always the center point of the view. Not the Specific touch area point.

Example : Double tapping at right most area of the view , onToucEvent is giving center of the view. if views width is 1080, then onTouchEvent() -> getX() is always 540.

I tried with a sample project..

public class customView extends FrameLayout {

    public customView(@NonNull Context context) {
        super(context);
        init();
    }

    public customView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public customView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    void init() {
        setFocusable(true);
        setFocusableInTouchMode(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("ANNN", "onTouchEvent : getX() " + event.getX() + ", getRawX() " + event.getRawX());
        return super.onTouchEvent(event);
    }

    @Override
    public boolean onHoverEvent(MotionEvent event) {
       Log.d("ANNN", "onHoverEvent : getX() " + event.getX() + ", getRawX() " + event.getRawX());
       return super.onHoverEvent(event);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
       Log.d("ANNN", "dispatchTouchEvent : getX() " + ev.getX() + ", getRawX() " + ev.getRawX());
       return super.dispatchTouchEvent(ev);
    }

    @Override
    protected boolean dispatchHoverEvent(MotionEvent event) {
       Log.d("ANNN", "dispatchHoverEvent : getX() " + event.getX() + ", getRawX() " + event.getRawX());
       return super.dispatchHoverEvent(event);
    }
}

LOG :

--> touching on right side of the view

2024-02-05 14:33:31.430 20982-20982 ANNN com...mple.testandroidaccessibility D onHoverEvent : getX() 903.6035, getRawX() 903.6035 2024-02-05 14:33:31.431 20982-20982 ANNN com...mple.testandroidaccessibility D dispatchHoverEvent : getX() 903.6035, getRawX() 903.6035 2024-02-05 14:33:31.431 20982-20982 ANNN com...mple.testandroidaccessibility D onHoverEvent : getX() 903.6035, getRawX() 903.6035

--> then just double tap. getX() is center of view.

2024-02-05 14:33:40.657 20982-20982 ANNN com...mple.testandroidaccessibility D dispatchTouchEvent : getX() 540.0, getRawX() 540.0 2024-02-05 14:33:40.657 20982-20982 ANNN com...mple.testandroidaccessibility D onTouchEvent : getX() 540.0, getRawX() 540.0 2024-02-05 14:33:40.657 20982-20982 ANNN com...mple.testandroidaccessibility D dispatchTouchEvent : getX() 540.0, getRawX() 540.0 2024-02-05 14:33:40.657 20982-20982 ANNN com...mple.testandroidaccessibility D onTouchEvent : getX() 540.0, getRawX() 540.0 2024-02-05 14:33:40.658 20982-20982 ANNN com...mple.testandroidaccessibility D dispatchTouchEvent : getX() 540.0, getRawX() 540.0 2024-02-05 14:33:40.658 20982-20982 ANNN com...mple.testandroidaccessibility D onTouchEvent : getX() 540.0, getRawX() 540.0 2024-02-05 14:33:40.658 20982-20982 ANNN com...mple.testandroidaccessibility D dispatchTouchEvent : getX() 540.0, getRawX() 540.0

In case of double tap, both getX() and getRaw() is center. But I need the Specific touch point of the view in onTouchEvent().

It would be great If somebody share the knowledge on how it can be achieved. Thank you!!

0

There are 0 best solutions below