在实验开始之前,必须要先构建项目,编写基本的代码。
public class MyButton extends Button {
private static final String TAG = MyButton.class.getSimpleName();
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
Log.i(TAG,"onTouchEvent ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG,"onTouchEvent ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i(TAG,"onTouchEvent ACTION_UP");
break;
}
return super.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
int action = event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "dispatchTouchEvent ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "dispatchTouchEvent ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "dispatchTouchEvent ACTION_UP");
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
}
编写一个button类,重写了onTouchEvent和dispatchTouchEvent,分别打印了DOWN,MOVE,UP事件的log,以便于实验观察。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_view_touch"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.dali.view.MyButton
android:id="@+id/btn"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_centerInParent="true"
android:text="点击"/>
</RelativeLayout>
activity_main.xml文件,没啥好说.
public class MainActivity extends AppCompatActivity {
protected static final String TAG = "MyButton";
public static void startActivity(Context context){
context.startActivity(new Intent(context,MainActivity.class));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.btn);
}
}
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onTouch ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onTouch ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "onTouch ACTION_UP");
break;
default:
break;
}
return false;
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "onClick");
}
});
MainActivity文件,找到button控件,开始实验.
1.点击button,会依次处理DOWN,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouchEvent
2.在button上,轻轻的划一划,会依次处理DOWN,MOVE,UP事件,处理的过程先后是:
dispatchTouchEvent–>onTouchEvent
3.在button上添加onTouchListener后,点击button,会依次处理DOWN,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouch–>onTouchEvent
4.在button上添加onTouchListener后,在button上,轻轻的划一划,会依次处理DOWN,MOVE,UP事件,处理的过程先后是:
dispatchTouchEvent–>onTouch–>onTouchEvent
5.在button上添加onTouchListener,onClickListner后,点击button,会依次处理DOWN,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouch–>onTouchEvent,当处理完所有的事件后,执行onClick
6.在button上添加onTouchListener,onClickListner后,在button上,轻轻的划一划,会依次处理DOWN,MOVE,UP事件,处理的过程先后是:dispatchTouchEvent–>onTouch–>onTouchEvent,当处理完所有的事件后,执行onClick
7.设置onTouchEvent的DOWN事件返回true,不会走onClick方法,经过上述多次实验,发现MOVE和UP事件得到的结果是一致的,同理MOVE事件也一致。
8.设置onTouch的DOWN事件返回true,不会走DOWN事件的onTouchEvent、onClick方法,但是不会影响UP事件的流程,同理MOVE事件也一致。
得出总结:消费事件的优先级:onTouch>onTouchEvent>onClick
9.设置dispatchTouchEvent中的DOWN事件返回true后,点击button,会发现DOWN事件只会走dispatchTouchEvent方法,但是不影响UP事件的正常流程,但是会发现,onClick也不走了。同理可得MOVE事件也一致。
10.设置dispatchTouchEvent中的UP事件返回true后,点击button,会发现UP事件只会走dispatchTouchEvent方法,但是不影响DOWN事件的正常流程,但是会发现,onClick也不走了。同理MOVE事件也一样。
总结:dispatchTouchEvent决定了单个事件的整个流程。
实验总结:
1. View的分发流程基本是:dispatchTouchEvent–>onTouchEvent
2. 消费事件的优先级:onTouch>onTouchEvent>onClick
3. dispatchTouchEvent决定了单个事件的整个流程。