Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑。onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent。onTouchEvent的定义位于View中,当ViewGroup要调用onTouchEvent时,会利用super.onTouchEvent。ViewGroup调用onTouchEvent默认返回false,表示不消耗touch事件,View调用onTouchEvent默认返回true,表示消耗了touch事件。考虑到onInterceptTouchEvent与onTouchEven在写UI的时候经常会用到,下面以一个例子来讲解一下。
先创建一个类MyView,继承自View
- public class MyView extends Button {
- private static final String TAG = MyView.class.getName();
- public MyView(Context context){
- super(context);
- }
- public MyView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- Log.d(TAG, "onTouchEvent.");
- LogUtil.logAction(event, TAG);
- return super.onTouchEvent(event);
- }
- }
创建类MyLayout,继承自ViewGroup
- public class MyLayout extends FrameLayout{
- private static final String TAG = MyLayout.class.getName();
- public MyLayout(Context context) {
- super(context);
- }
- public MyLayout(Context context, AttributeSet attributeSet) {
- super(context, attributeSet);
- }
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- Log.d(TAG, "onInterceptTouchEvent");
- return super.onInterceptTouchEvent(ev);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- Log.d(TAG, "onTouchEvent.");
- LogUtil.logAction(event, TAG);
- return super.onTouchEvent(event);
- }
- }
LogUtil.logAction()函数是用来打印MotionEvent的动作类型,代码如下:
- public class LogUtil {
- public static void logAction(MotionEvent event, final String tag) {
- int action = event.getAction();
- switch(action) {
- case MotionEvent.ACTION_DOWN:
- Log.d(tag, "action down");
- break;
- case MotionEvent.ACTION_CANCEL:
- Log.d(tag, "action cancel");
- break;
- case MotionEvent.ACTION_UP:
- Log.d(tag, "action up");
- break;
- case MotionEvent.ACTION_MOVE:
- Log.d(tag, "action move");
- break;
- default:
- Log.d(tag, "unknow action");
- }
- }
- }
布局文件main.xml将MyView嵌套在MyLayout中,代码如下:
- <view android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- class="com.example.AndroidTest.MyLayout" xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/view">
- <com.example.AndroidTest.MyView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="hello" />
- </view>
MainActivity的代码如下:
- public class MainActivity extends Activity {
- public static final String TAG = "TouchDemoActivity";
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- }
程序启动后,截图如下。
下面分情况讨论程序的运行结果。
1、MyLayout的onInterceptTouchEvent返回false,MyView的onTouchEvent返回true
情况1:当点击蓝色框内的任意位置,只有MyLayout会接收事件,输出的Log如下:
可以看出,touch事件最后会被MyLayout的onTouchEvent接收到。
情况2: 点击红色框内的黑色区域,由于onInterceptTouchEvent()返回false,故MyView也能接收到touchEvent事件,输出的Log如下:
可以看出,由于MyView的onTOuchEvent默认返回True,消耗了touch事件,MyLayout中的onTOuchEvent将不会被调用。
当我们的手指按下黑色区域,停留几秒再抬起,得到的Log如下图:
可以看出,第一个事件的类型为action down,最后一个为action up,中间的都是action move的类型,这正好符合上一篇文章介绍的Android的手势定义。
2、MyLayout的onInterceptTouchEvent返回false,MyView的onTouchEvent返回false
改写MyView中onTouchEvent的代码,令其返回false
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- Log.d(TAG, "onTouchEvent.");
- LogUtil.logAction(event, TAG);
- return false;
- }
由于MyView没有消耗touch事件,MyLayout的onTouchEvent将会被调用,打印的log如下:
可以看出,touch的类型只为action down。
3、MyLayout的onInterceptTouchEvent返回true
改写MyLayout中的onInterceptTouchEvent代码,令其返回true
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- Log.d(TAG, "onInterceptTouchEvent");
- return true;
- }
由于MyLayout拦截了touch事件,MyView中的onTouchEvent将不会被调用,log如下:
以上对Android的onInterceptTouchEvent和onTouchEvent的描述若有不妥之处,欢迎指正。
本文参考的代码出自:两分钟彻底让你明白Android中onInterceptTouchEvent与onTouchEvent(图文)!,感谢作者的无私分享。
Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程的更多相关文章
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.on ...
- Android核心分析之十五Android输入系统之输入路径详解
Android用户事件输入路径 1 输入路径的一般原理 按键,鼠标消息从收集到最终将发送到焦点窗口,要经历怎样的路径,是Android GWES设计方案中需要详细考虑的问题.按键,鼠标等用户消息 ...
- Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)
最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...
- Android内存解析(二)— 详解内存,内部存储和外部存储
总述 觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿. 先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据? ...
- Ubuntu 14.10 下查看系统硬件信息(实例详解)
linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并做了分类,实例解说. cpu lscpu命令,查看的是cpu的统计信息. blue@blue-pc:~ ...
- Linux 查看系统硬件信息(实例详解)
原文链接:http://www.cnblogs.com/ggjucheng/archive/2013/01/14/2859613.html linux查看系统的硬件信息,并不像windows那么直观, ...
- [转载]查看Linux系统硬件信息实例详解
linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并做了分类,实例解说. cpu lscpu命令,查看的是cpu的统计信息. blue@blue-pc:~ ...
- Appium+python自动化(三十四)- 有图有真相,很美很精彩 - 屏幕截图和Android APP类型简介(超详解)
简介 在实际自动化项目运行过程中,很多时候App可以会出现各种异常,为了更好的定位问题,除了捕捉日志我们还需要对运行时的设备状态来进行截屏.从而达到一种“有图有真相”的效果. 截图方法 方法1 sav ...
- Android加载大图片实例详解
摘要:在Android下采用ARGB表示颜色,每个像素占四个字节.其加载图片申请空间时与图片的实际大小没有关系,与像素有关系.
随机推荐
- 使用BeanUtils组件
使用BeanUtils组件 前提 1:导入commons-beanutils-1.8.3.jar //根据 本人使用的是1.8.3的版本 2:导入日志包 //就是loggin ...
- call/apply的第一个参数如果为null。this指向window
call/apply是用来改变函数的作用域的,第一次参数为this,第二个参数为传输的值,例如 var a ="windowA"; var b = "windowB&qu ...
- CSS3 Animation学习笔记
Internet Explorer 9,以及更早的版本, 不支持 @keyframe 规则或 animation 属性. Internet Explorer 10.Firefox 以及 Opera 支 ...
- 控制寄存器 CR*
控制寄存器(CR0-CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性,如图4-3所示.CR0中含有控制处理器操作模式和状态的系统控制标志:CR1保留不用:CR2含有导致页错误的线性地址:C ...
- 实例:jQuery实现标签切换
具体实现效果如图: 原理很简单,就是监听鼠标滑动和点击事件.在第一个标签切换的示例中,当鼠标滑过某个标签时,就把class转移到当前标签.这里用到的jQuery方法主要是each()确定当前是哪一个标 ...
- php && 逻辑与运算符使用说明
例子:!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); o(︶︿︶ ...
- ubuntu wubi安装注意事项
从这个镜像下载 http://mirrors.163.com/ubuntu-releases/12.10/ ubuntu-12.10-desktop-amd64.iso 和 wubi.exe然后放到同 ...
- 人在江湖飘,哪能不挨刀。CENTOS之后,UBUNTU,FEDORA都要安装起来作测试啊
还好,我们有VIRTUAL BOX.
- Windows Server 2012 R2里十个极好的新功能
Windows Server 2012 R2具备的众多新特点大大的增强了操作系统的功能性,同时也是在Windows Server 2012原有功能上的拓展.这里整理出Windows Server 20 ...
- 【HDOJ】2428 Stars
先排序后二分. #include <iostream> #include <cstdio> #include <cstring> #include <algo ...