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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…