美文网首页
android 模拟view中的某个控件点击

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

作者: 是你呀小鑫 | 来源:发表于2021-11-03 15:55 被阅读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);

    }

    相关文章

      网友评论

          本文标题:android 模拟view中的某个控件点击

          本文链接:https://www.haomeiwen.com/subject/grhczltx.html