Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Activity's onTouchEvent() is not being called while clicking on Button

I want to do some B.logic in Activity.onTouchEvent() method. It is working fine for TextView and other non clickable views. However, it is not getting called uponclicking of Button. But I need that too.

Here is the code.

public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Oh shit!! click performed... :(", Toast.LENGTH_LONG).show();

            }
        });



    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d(TAG, "ssssssssssssssssssssssss:touch");
        return super.onTouchEvent(event);
    }

    public boolean dispatchTouchEvent(MotionEvent event) {
        int eventaction=event.getAction();

        switch(eventaction) {
        case MotionEvent.ACTION_MOVE:
            break;
        default:
            break;
        }

        return super.dispatchTouchEvent(event);
    }

}

Please help me to sort out from this.

like image 817
Noundla Sandeep Avatar asked Apr 01 '13 09:04

Noundla Sandeep


2 Answers

I have used dispatchTouchEvent(MotionEvent ev) as required. Here is the solution.

private boolean isInSideClicked = false;
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        View content = findViewById(R.id.textView1);
        int[] contentLocation = new int[2];
        content.getLocationOnScreen(contentLocation);
        Rect rect = new Rect(contentLocation[0], 
                             contentLocation[1], 
                             contentLocation[0] + content.getWidth(), 
                             contentLocation[1] + content.getHeight());
        
        View frame = findViewById(R.id.editText1);
        int[] frameLocation = new int[2];
        frame.getLocationOnScreen(frameLocation);
        Rect framerect = new Rect(frameLocation[0], 
                                  frameLocation[1], 
                                  frameLocation[0] + frame.getWidth(), 
                                  frameLocation[1] + frame.getHeight());
        Log.d(TAG, "rect:  "+rect.bottom+" , "+rect.top+" , "+rect.left+" , "+rect.right);
        Log.d(TAG, "FrameRect:  "+framerect.bottom+" , "+framerect.top+" , "+framerect.left+" , "+framerect.right);
        Log.d(TAG, "x: "+event.getX()+"  y: "+event.getY());
        
        if ((rect.contains((int)event.getX(), (int)event.getY()) || framerect.contains((int)event.getX(), (int)event.getY()) ) ) {
            isInSideClicked = true;
        }
        if (isInSideClicked){
            return super.dispatchTouchEvent(event); 
        } else {
            return true;
        }
    } else if (event.getAction() == MotionEvent.ACTION_UP && isInSideClicked) {
        isInSideClicked = false;
        return super.dispatchTouchEvent(event);
    } else if (event.getAction() == MotionEvent.ACTION_MOVE && isInSideClicked) {
        return super.dispatchTouchEvent(event);
    } else {
        isInSideClicked = false;
        return true; 
    }
}

Below is the hierarchy on how the touch event is processed by OS level.

Activity.dispatchTouchEvent()
ViewGroup.dispatchTouchEvent()
View.dispatchTouchEvent()
View.onTouchEvent()
ViewGroup.onTouchEvent()
Activity.onTouchEvent()

With this I have restricted the touch events of the views which are not in required layouts/views.

like image 146
Noundla Sandeep Avatar answered Nov 06 '22 23:11

Noundla Sandeep


Where you have registering the touchListener for the button. You have only implemented the clickListener for the button. To invoke the onTouchEvent() for button,you have to Register the button as: button.setOnTouchListener(this);

like image 21
Ranjit Avatar answered Nov 06 '22 22:11

Ranjit