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表示颜色,每个像素占四个字节.其加载图片申请空间时与图片的实际大小没有关系,与像素有关系.
随机推荐
- skip-grant-tables的作用
skip-grant-tables:非常有用的mysql启动参数(不启动grant-tables授权表) skip-grant-tables:非常有用的mysql启动参数 介绍一个非常有用的mys ...
- git学习利器:《Git Pro》中文版
Git书籍有<版本控制之道git>,但是很一般.强烈推荐<Git Pro>中文版! 很多开源软件的教程也是免费开源的在线阅读的. <Git Pro>中文版在线阅读h ...
- SQL服务器名称的更改
SQL服务器名称的更改 1.使用select @@ServerName可以看到当前数据库的服务器名称 2.从Sys.SysServers表中可以看到当前的所有服务器名称 3.使用 sp_drops ...
- nginx1.8+php5.6.10 服务器编译安装备忘2015-06
又要重新装一台阿里云服务器.开始想用脚本,但发现脚本的程序版本都比较低 还是手动编译最新版本 开始前 更新服务器到最新版本 #yum makecache #yum update //分区挂数据盘 # ...
- webapp开发——‘手机屏幕分辨率’与‘浏览器分辨率’不要混淆
关于webApp响应式设计遇到的问题,分享给大家,最近在做一个手机webApp,因为我手机是”米3“,屏幕截图大小是1080宽,所以css样式用@media screen and(min-width: ...
- C语言知识总结
明白一些变量 熟悉一些语句 组合一些函数 C语言——>库 帮你写好放在库中 魔数 凭空变出来的数字,不知道 数字表示的含义,影响代码的可读性. C语音的参数传递 非常特殊,传递的是一个替身. ...
- java项目导出jar文件时指定main方法的类
需要先运行一下main函数,eclipse的Export-->Runnable JAR File ---> 下的Launch configuration下拉列表才会有记录.如果想要删除下拉 ...
- 【Linux】基础配置-修改命令提示符的风格
1,效果图: [groot]$ 2,设置步骤: 编辑~/.bashrc文件,在最后增加设置行: #显示当面目录的最后一层目录#PS1='\[\e[32m\][\u@\h \W]$\[\e[m\]'#只 ...
- Biathlon Track
Codeforces Round #242 (Div. 2) D:http://codeforces.com/contest/424/problem/D 题意:给你一个n*m的矩阵,每个格子上面有个数 ...
- 牢记负载均衡与HA,高性能是不同的方案。一般的CLUSTER只能实现其中的一种,而ORACLE的RAC可以有两种。
F5/LVS<—Haproxy<—Squid/Varnish<—AppServer. 现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术: 第一 ...