最近项目中有个需求,点击某一个按钮以外的位置触发按钮的点击事件。 但是这整个view 都是第三方的。
通过父容器的dispatchTouchEvent(MotionEvent ev) 对事件进行控制和分发。
(1)找到要触发的按钮,获取他的坐标 通过递归找到对应的控件
(2)判断点击是否在控件上
/**
* 判断是否点击在view上
*
* @param pointX
* @param pointY
* @param view
* @return
*/
private boolean isPointInView(float pointX, float pointY, View view) {
if (view ==null) {
return false;
}
int[] location =new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
if (pointX >= x && pointX <= x + view.getWidth() && pointY >= y && pointY <= y + view.getHeight()) {
return true;
}
return false;
}
(3) 如果不在控件的位置,则通过传递 控件的MotionEvent 设置MotionEvent 的location ,分发child.dispatchTouchEvent 事件
private boolean dispatchChildTouchEvent(MotionEvent ev, View child) {
MotionEvent transformedEvent = MotionEvent.obtain(ev);
if (downPosX ==0 ||downPosY ==0) {
int wd = Math.max(child.getWidth(), 1);
int hg = Math.max(child.getHeight(), 1);
Random random =new Random();
downPosX = random.nextFloat() *(wd -1);
downPosY = random.nextFloat() *(hg -1);
}
transformedEvent.setLocation(downPosX, downPosY);
Logger.d(TAG, "dispatchChildTouchEvent"+" posx " +downPosX +" posy " +downPosY);
return child.dispatchTouchEvent(transformedEvent);
}
网友评论