I was wondering if there is a way to know exactly where a button was tapped, and take different actions based on where the user tapped it. Something like:
fooBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        switch(onClickLocation){
            case LEFT:
                foo();
                break;
            case RIGHT:
                bar();
                break;
            case MIDDLE:
                baz();
                break;
        }
    }
});
				
                        
Not using an
OnClickListener.OnTouchListenergives you aMotionEventthat you can use to determine where the actual touch event occurred.For example, here I register both an
OnClickListenerand anOnTouchListeneron the sameView(calledrow):In this case, I don't need to know where the widget was touched for processing the click, but I do need to know where the widget was touched for adjusting the
RippleDrawablebackground, so the ripple appears to emanate from where the user touched. ReturningfalsefromonTouch()means I am not consuming the touch event, and so eventually myonClick()method will also be called.In your case, either:
do the actual work in
onTouch(), orcache the last-seen touch point in
onTouch()but do not do the work untilonClick()My gut tells me that the latter should give you better results (e.g., you won't misinterpret a long-click), but I have not tried doing what you are seeking.