学习View事件分发笔记(一)

本文通过自定义View并重写事件分发方法,深入探讨了Android中事件分发的过程,包括dispatchTouchEvent和onTouchEvent方法的作用及响应顺序。

这段时间有看很多大神写的关于事件分发的博文。但是,每次看完没一段时间就忘记了。。。码蛋,鉴于这东西实在太过重要,还是自己好好琢磨琢磨。。。

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事件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值