個人部落格:haichenyi.com。感謝關注
本篇介紹實作模拟點選的兩種方式:
- performClick();
- 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的弊端。