这段时间有看很多大神写的关于事件分发的博文。但是,每次看完没一段时间就忘记了。。。码蛋,鉴于这东西实在太过重要,还是自己好好琢磨琢磨。。。
View事件分发涉及到的方法主要有dispatchTouchEvent(MotionEvent event),onTouchEvent(MotionEvent event)以及绑定OnTouchListener()实现的onTouch(View v, MotionEvent event)方法。
首先,我自定义一个View并继承自Button,重写里面的dispatchTouchEvent(MotionEvent event)和onTouchEvent(MotionEvent event)方法。代码如下:
public class MyButton extends Button {
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.e("dispatchTouchEvent","dispatchTouchEvent");
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("onTouchEvent","onTouchEvent");
return super.onTouchEvent(event);
}
}
然后在布局文件中加入自定义View。代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.example.testtouch.view.MyButton
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</RelativeLayout>
最后就是在Activity中找到这个控件,并给它绑定onTouchListener了。
public class MainActivity extends ActionBarActivity {
private MyButton btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (MyButton) findViewById(R.id.btn);
btn.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("onTouch","onTouch");
return false;
}
});
}
}
好了,基本的代码就这些,运行程序点击按钮,查看Log信息如下:
不难发现,响应事件的先后顺序为
dispatchTouchEvent(MotionEvent event)
-----> onTouch(View v, MotionEvent event)
-----> onTouchEvent(MotionEvent event)方法。
(此处由于是点击按钮产生了Action_Down和Action_Up两次事件,因此打印了2次分发流程,如果你手抖还
会产生N多的Action_Move事件)