天天看點

Android模拟點選

個人部落格:haichenyi.com。感謝關注

  本篇介紹實作模拟點選的兩種方式:

  1. performClick();
  2. MotionEvent事件

  舉個栗子:我們現在需要實作點選A按鈕,觸發B按鈕點選事件的效果:兩個按鈕在布局裡面随便建立就好了。

  第一種方式就是:調用performClick事件

Button btn1 = findViewById(R.id.btn1);
        final Button btn2 = findViewById(R.id.btn2);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.v("wz","btn1");
                btn2.performClick();
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.v("wz","btn2");
            }
        });
           

  這種方式很簡單,但是有一個弊端,就是不會傳遞觸摸點坐标,隻是模拟一下btn2的點選事件。

  第二種方式就是:MotionEvent事件

Button btn1 = findViewById(R.id.btn1);
        final Button btn2 = findViewById(R.id.btn2);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.v("wz","btn1");
                long downTime = SystemClock.uptimeMillis();
                long eventTime = SystemClock.uptimeMillis()+100;
                float upX = btn2.getX()+50;
                float upY = btn2.getY()+50;
                MotionEvent obtainDown = MotionEvent.obtain(downTime, eventTime, ACTION_DOWN, upX, upY, 0);

                long downTime1 = SystemClock.uptimeMillis();
                long eventTime1 = SystemClock.uptimeMillis()+100;
                float upX1 = btn2.getX()+50;
                float upY1 = btn2.getY()+50;
                MotionEvent obtainUp = MotionEvent.obtain(downTime1, eventTime1, MotionEvent.ACTION_UP, upX1, upY1, 0);
                btn2.dispatchTouchEvent(obtainDown);
                btn2.dispatchTouchEvent(obtainUp);
                obtainDown.recycle();
                obtainUp.recycle();
                Log.v("wz","downTime:"+downTime+" ,eventTime:"+eventTime+" ,upX:"+upX+" ,upY:"+upY+" ,downTime1:"+downTime1+" ,eventTime1:"+eventTime1+" ,upX1:"+upX1+" ,upY1:"+upY1);
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.v("wz","btn2");
            }
        });

           

  這種方式比較麻煩,用到的就是view的事件分發,一個簡單的點選事件的觸發就是down和up組成,當然還有平移我們這裡不考慮。

  第一步,先用MotionEvent.obtain建立兩個事件:一個down事件,一個up事件,建立的時候需要傳遞坐标點,傳你目标view的範圍内的坐标就行。

  第二步,通過目标view,也就是這裡的btn2去把這兩個事件分發出去,通過dispatchTouchEvent分發,這樣就完成了一次模拟點選事件,分發完記得回收

  這樣,就完成了一次模拟點選,并且坐标也傳遞了。因為,建立這兩個事件的時候就傳遞了。解決了performClick的弊端。