您的位置:首页 > 移动开发 > Android开发

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事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: