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表示颜色,每个像素占四个字节.其加载图片申请空间时与图片的实际大小没有关系,与像素有关系.
随机推荐
- APP被Rejected 的各种原因翻译(转)
原文:http://www.cnblogs.com/sell/archive/2013/02/16/2913341.html Terms and conditions(法律与条款) 1.1 As a ...
- 『重构--改善既有代码的设计』读书笔记----Extract Class
在面向对象中,对于类这个概念我们应该有一个清晰的责任认识,就是每个类应该只有一个变化点,每个类的变化应该只受到单一的因素,即每个类应该只有一个明确的责任.当然了,说时容易做时难,很多人可能都会和我一样 ...
- 关于Linux 交互(用户操作接口)
Linux 系统提供两种基本接口给用户操作:命令行,图形界面. 不同接口也有相应的访问终端. 一.命令行 Command Line Linux系统命令行,一般指 Shell. Shell 接受经键盘输 ...
- JQuery 点击控件获取当前坐标时不兼容IE7
现在要求在点击文本框时,获取文本框的坐标,需要相对文本框的位置来显示信息. 思路就是,绑定文本框的click 事件,一旦有点击就触发,去调用clickevent 函数执行计算. $('#txt_m') ...
- devicePixelRatio
devicePixelRatio window.devicePixelRatio是设备上物理像素和逻辑像素的比例.公式表示就是:window.devicePixelRatio = 物理像素 / 逻辑像 ...
- PM加油站
老郭讲述深航CSM 1.需求有遗漏,人员水平不足:加班导致人员流失:但是这样,客户后来还是好评,并且项目被评为深航的标杆项目:老郭也是被指定为未来项目的项目经理:--!我想起了古时候的一句话:功夫在诗 ...
- 支付宝集成获取私钥与公钥-b
项目需要,需要在客户端集成支付宝接口.就研究了一下:因为使用支付宝接口,就需要到支付宝官网:注册帐号,并申请.下面讲的是申请好之后的操作.登录成功之后, 店家我的商家服务—在页面的下方找到——&g ...
- 关于Verilog 中的for语句的探讨
在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...
- 转:Java程序员最常用的8个Java日志框架
作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...
- 工作总结:qsort函数用法
qsort(&g_AMTBuf[g_dwAMTLenth], m_nCount, sizeof(12), Compare); 参数说明: 1.待排序数组首地址: 2.数组中待排序元素数量: 3 ...