android onInterceptTouchEvent()和onTouchEvent()的总结
来源:互联网 发布:大班pg菲尼克斯淘宝 编辑:程序博客网 时间:2024/05/12 23:03
onInterceptTouchEvent:
故名思议:拦截触摸事件 intercept 拦截,截断 TouchEvent 触摸事件onInterceptTouchEvent是ViewGroup里定义的,View里面没有。
onInterceptTouchEvent是否拦截主要看返回值,返回true拦截,返回false(super.onInterceptTouchEvent(ev))不拦截,
系统默认返回false,这样touch事件会传递到View中。
onTouchEvent:
onTouchEvent在ViewGroup和View中都有定义。用于处理手势事件。
手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件。
运行效果图
上图先理解一下,如果点击蓝色Button,首先调用ViewGroup里的onInterceptTouchEvent判断是否拦截,
拦截的话,调用ViewGroup自己的onTouchEvent方法
不拦截,事件传递给子控件button,调用Button中的onTouchEvent方法
二、上代码
1、新建一个ViewGroup代码如下:
package com.datong.mytouchdemo;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.FrameLayout;/** * Created by liyongjian on 2016/4/6. */public class ViewGroup1Activity extends FrameLayout{ public ViewGroup1Activity(Context context) { super(context); } public ViewGroup1Activity(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent"); Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent default :" + super.onInterceptTouchEvent(ev)); return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { Log.e(MainActivity.TAG,"ViewGroup1Activity onTouchEvent"); Log.e(MainActivity.TAG,"ViewGroup1Activity onTouchEvent default :" + super.onTouchEvent(event)); return super.onTouchEvent(event); }}
2、新建一个view Button代码如下:
package com.datong.mytouchdemo;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.Button;/** * Created by liyongjian on 2016/4/6. */public class MyButtonActivity extends Button{ public MyButtonActivity(Context context) { super(context); } public MyButtonActivity(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { Log.e(MainActivity.TAG, "MyButtonActivity onTouchEvent"); Log.e(MainActivity.TAG,"MyButtonActivity onTouchEvent default :" + super.onTouchEvent(event)); return super.onTouchEvent(event); }}
3、新建布局activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?><com.datong.mytouchdemo.ViewGroup1Activity xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="350dp" android:background="#ff0000" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ViewGroup1" android:textSize="30sp" android:textColor="#ffffff" /> <com.datong.mytouchdemo.MyButtonActivity android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="60dp" android:background="#0000ff" android:text="Button" android:textSize="20sp" android:textColor="#ffffff" /></com.datong.mytouchdemo.ViewGroup1Activity>
4、主activity代码如下:
package com.datong.mytouchdemo;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity { public static final String TAG = "TAG"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}
三、运行程序,效果图在上边
(1)、不设置拦截
1、点击蓝色Button,Log如下图:
可见点击button先调用ViewGroup的onInterceptTouchEvent方法,并且默认返回false不拦截,
然后再调用Button的onTouchEvent方法,并且View的onTouchEvent默认返回true。
2、点击红色ViewGroup,Log如下图:
可见点击ViewGroup先调用ViewGroup的onInterceptTouchEvent方法,
然后再调用ViewGroup自己的onTouchEvent方法,并且onTouchEvent默认返回false。
(2)ViewGroup拦截,修改ViewGroup中onInterceptTouchEvent返回值为true,修改代码如下:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent"); Log.e(MainActivity.TAG,"ViewGroup1Activity onInterceptTouchEvent default :" + super.onInterceptTouchEvent(ev)); return true; }1、点击蓝色Button,Log如下图:
可见点击button先调用ViewGroup的onInterceptTouchEvent方法,由于修改返回值为true,设置为拦截,
由于设置为拦截,还是调用ViewGroup的onTouchEvent方法。
2、点击红色ViewGroup,Log如下图:
不需要解释了吧。。。。。
最后总结:
ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent.
ViewGroup里的onTouchEvent默认值是false。
View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件。
- android onInterceptTouchEvent()和onTouchEvent()的总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android onInterceptTouchEvent()和onTouchEvent() 总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结 .
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- Android-onInterceptTouchEvent()和onTouchEvent()总结
- hugepages
- pycharm连接数据库
- css的负边距(margin负值)的绝招
- 原ubuntu下安装dokuwiki
- 每个C++开发者都应该使用的十个C++11特性
- android onInterceptTouchEvent()和onTouchEvent()的总结
- Nginx Location配置总结
- MySql避免重复插入记录
- 王道求职宝典,硬币分发问题,采用深度优先搜索算法
- strcpy_s的坑
- ViewPager预加载机制
- 初级用户体验设计师可以向其他合作伙伴学习什么?(运营&PD篇)
- 彻底删除MySQL
- JPA criteria 查询:类型安全与面向对象