android 模拟view中的某个控件点击

2021-11-03  本文已影响0人  是你呀小鑫

最近项目中有个需求,点击某一个按钮以外的位置触发按钮的点击事件。 但是这整个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);

}

上一篇下一篇

猜你喜欢

热点阅读