Android对onTouch触摸事件的处理
2014-11-21 15:12
295 查看
在Android对onTouch主要调用三个方法对触摸传递:
1、public boolean dispatchTouchEvent(MotionEvent ev) //在触摸时,Android首先调用的是这个方法,其分配何时调用onInterceptTounch和onTouchEvent,单纯的返回true和false是不行的,不会调用者2个方法。当必须重写这方法,又要调用其他2个触摸方法是,必须return super.dispatchTouchEvent(ev)。
2、public boolean onInterceptTouchEvent(MotionEvent ev) // 这个方法主要用于父类对触摸事件的拦截处理,看是否需要传递给子类,返回false表示事件没处理完,子类就可以接收到触摸事件了,所以这个类只有那种有可以有子控件的ViewGrop才有的,像LinearLayout就有,Button和TextView没有这个方法。
3、public boolean onTouchEvent(MotionEvent ev) //处理事件
我写了个demo对触摸事件的研究,xml布局如下:
<com.lcc.testzidingy.widget.MyLinear
android:id="@+id/mylinear"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<com.lcc.testzidingy.widget.MyButton
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:background="@color/green"
android:gravity="center"
android:text="看看自定义控件,个方法运行顺序"/>
</com.lcc.testzidingy.widget.MyLinear>
然后对于父控件MyLinear中重写了上面三个方法,对于不同的返回值也有备注,代码如下:
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("-----------onTouchEvent----event事件没被子view拦截,就会在调用父控件的这个-----");
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
System.out.println("-----------onInterceptTouchEvent---这个先------");
// return super.onInterceptTouchEvent(ev);
// return false; //返回false,事件会传递给子View 的onTouchEvent;
return true;//返回true,事件不会传递给子View 的 onTouchEvent;这里执行完全了,
//直接调用ViewGroup(即本控件)的onTouchEvent
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
System.out.println("-----------dispatchTouchEvent---最开始调用,比onintercpetTounch先------");
return super.dispatchTouchEvent(ev);
// return true; //不会调用 onTouchEvent 和 onInterceptTouchEvent
// return false; //也不会调用 onTouchEvent 和 onInterceptTouchEvent
//所以自定义控件没必要重新这个类 .super.dispatchTouchEvent(ev)有机制什么时候调用哪个类 ,这个类本来就是用于 //用于事件的分发
}
在子控件MyButton中重写了onTounchEvent方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("---父viewoninterceptTounch返回false时-子view接到按下事件------------");
// return false; //返回false,父类的ontouch能接收到触摸事件,本view的move没有接收到触摸事件
return true;//父类的onTounch不能接受到触摸事件。本view的move可以接收到触摸事件
case MotionEvent.ACTION_MOVE:
System.out.println("---子view的move,查看子view down返回有无事件返回---------");
default:
break;
}
return super.onTouchEvent(event);
}
其实关于android的onTouch触摸事件,在上面代码中的注释都写明白了。下面我们可以用文字总结下。
当我们触摸按下的时候。
1、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回true,触摸事件不会传递给子view,直接调用父控件的onTouchEvent。
2、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回false------>传递给子view的onTouchEvent,if子view返回false.
------->事件传递给父控件的onTouchEvent,子控件的onTouchEvent触摸事件消失,后续的move和up不会再执行了
3、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回false------>传递给子view的onTouchEvent,if子view返回true.
------->事件不会传递给父控件的onTouchEvent,子控件的onTouchEvent触摸事件还保留了,当move或者up的时候,触摸流程事件如第二条前面的部分,先执行父控件的
dispatchTouchEvent和onInterceptTouchEvent,然后根据情况再执行子控件的move或者up事件。
1、public boolean dispatchTouchEvent(MotionEvent ev) //在触摸时,Android首先调用的是这个方法,其分配何时调用onInterceptTounch和onTouchEvent,单纯的返回true和false是不行的,不会调用者2个方法。当必须重写这方法,又要调用其他2个触摸方法是,必须return super.dispatchTouchEvent(ev)。
2、public boolean onInterceptTouchEvent(MotionEvent ev) // 这个方法主要用于父类对触摸事件的拦截处理,看是否需要传递给子类,返回false表示事件没处理完,子类就可以接收到触摸事件了,所以这个类只有那种有可以有子控件的ViewGrop才有的,像LinearLayout就有,Button和TextView没有这个方法。
3、public boolean onTouchEvent(MotionEvent ev) //处理事件
我写了个demo对触摸事件的研究,xml布局如下:
<com.lcc.testzidingy.widget.MyLinear
android:id="@+id/mylinear"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<com.lcc.testzidingy.widget.MyButton
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_gravity="center_horizontal"
android:background="@color/green"
android:gravity="center"
android:text="看看自定义控件,个方法运行顺序"/>
</com.lcc.testzidingy.widget.MyLinear>
然后对于父控件MyLinear中重写了上面三个方法,对于不同的返回值也有备注,代码如下:
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("-----------onTouchEvent----event事件没被子view拦截,就会在调用父控件的这个-----");
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
System.out.println("-----------onInterceptTouchEvent---这个先------");
// return super.onInterceptTouchEvent(ev);
// return false; //返回false,事件会传递给子View 的onTouchEvent;
return true;//返回true,事件不会传递给子View 的 onTouchEvent;这里执行完全了,
//直接调用ViewGroup(即本控件)的onTouchEvent
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
System.out.println("-----------dispatchTouchEvent---最开始调用,比onintercpetTounch先------");
return super.dispatchTouchEvent(ev);
// return true; //不会调用 onTouchEvent 和 onInterceptTouchEvent
// return false; //也不会调用 onTouchEvent 和 onInterceptTouchEvent
//所以自定义控件没必要重新这个类 .super.dispatchTouchEvent(ev)有机制什么时候调用哪个类 ,这个类本来就是用于 //用于事件的分发
}
在子控件MyButton中重写了onTounchEvent方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("---父viewoninterceptTounch返回false时-子view接到按下事件------------");
// return false; //返回false,父类的ontouch能接收到触摸事件,本view的move没有接收到触摸事件
return true;//父类的onTounch不能接受到触摸事件。本view的move可以接收到触摸事件
case MotionEvent.ACTION_MOVE:
System.out.println("---子view的move,查看子view down返回有无事件返回---------");
default:
break;
}
return super.onTouchEvent(event);
}
其实关于android的onTouch触摸事件,在上面代码中的注释都写明白了。下面我们可以用文字总结下。
当我们触摸按下的时候。
1、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回true,触摸事件不会传递给子view,直接调用父控件的onTouchEvent。
2、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回false------>传递给子view的onTouchEvent,if子view返回false.
------->事件传递给父控件的onTouchEvent,子控件的onTouchEvent触摸事件消失,后续的move和up不会再执行了
3、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回false------>传递给子view的onTouchEvent,if子view返回true.
------->事件不会传递给父控件的onTouchEvent,子控件的onTouchEvent触摸事件还保留了,当move或者up的时候,触摸流程事件如第二条前面的部分,先执行父控件的
dispatchTouchEvent和onInterceptTouchEvent,然后根据情况再执行子控件的move或者up事件。
相关文章推荐
- Android:处理触摸事件
- Android键盘和触摸事件处理
- android onTouchEvent 左右手势滑动事件处理
- 从零开始学android:Android事件处理—触摸事件
- android 屏幕触摸事件的分发与处理
- Android键盘和触摸事件处理
- Android键盘和触摸事件处理
- Android开发--事件的处理/按键按下,弹起,触摸事件等
- android click 和onTouch 事件处理机制
- android onTouchEvent 左右手势滑动事件处理
- android键盘和触摸事件先后顺序处理
- android中的触摸事件处理过程详解
- Android键盘和触摸事件处理
- Android键盘和触摸事件处理
- android中处理各种触摸事件
- android 复杂的ontouch事件处理
- android click 和onTouch 事件处理机制 (转)
- android各种触摸事件的处理,touchEvent
- android的触摸事件处理
- android 在ViewGroup中处理触摸事件 [Managing Touch Events in a ViewGroup]