案例背景:
  当我们实现viewpager的自动切换界面操作的时候,如果需要增加点击图片viewpager停止自动切换,松开手指viewpager自动切换又继续执行的逻辑,正常思维下实现代码如下所示:

利用handler发送消息实现viewpager 自动滑动
        if (handler == null) {
            handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    // 实现切换 viewpager 界面
                    // 获取当前显示界面的索引
                    int currentItem = mViewPager.getCurrentItem();
                    // 计算下一个界面的索引
                    // 判断如果切换到最后一个界面,需要重新切换回第一个界面进行操作
                    if (currentItem == imageurls.size()-1) {
                        currentItem=0;
                    }else{
                        currentItem++;
                    }
                    // 设置 viewpager 显示下一个界面
                    mViewPager.setCurrentItem(currentItem);
                    // 一次切换完成,还需要接着执行第二次
                    handler.sendEmptyMessageDelayed(0, 3000);
                }
            };
            handler.sendEmptyMessageDelayed(0, 3000);// 延迟 3 秒个 handler 发送消息
        }                 // 设置 viewpager 条目界面的触摸事件,实现按下 viewpager 停止滑动,抬起 viewpager 重新滑动
        rootview.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 停止发送 handler 延迟消息
                handler.removeCallbacksAndMessages(null);// 参数如果是 null ,表示删除所有的延迟消息
                break;
            case MotionEvent.ACTION_UP:
                // 重新发送 handler 延迟消息,实现 viewpager 自动滑动
                handler.sendEmptyMessageDelayed(0, 3000);
                break;
            }
            // 返回 true: 执行触摸监听操作, false :不执行
            return true;
            }
        });

  即:在手指按下的时候利用handler发送停止消息而到当手指抬起的时候发送继续切换的消息 然而在实际的操作中我们发现当手指抬起的时候viewpager不能继续实现自动切换,通过对代码进行log操作发现手指抬起的时候view并没有执行up方法而是执行了cancel方法,故代码修改如下:

// 设置 viewpager 条目界面的触摸事件,实现按下 viewpager 停止滑动,抬起 viewpager 重新滑动
rootview.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 停止发送 handler 延迟消息
handler.removeCallbacksAndMessages(null);// 参数如果是 null ,表示删除所有的延迟消息
break;
case MotionEvent.ACTION_UP:
// 重新发送 handler 延迟消息,实现 viewpager 自动滑动
handler.sendEmptyMessageDelayed(0, 3000);
break;
case MotionEvent.ACTION_CANCEL:
// 当取消 view 的事件的时候,重新让 viewpager 自动滑动
handler.sendEmptyMessageDelayed(0, 3000);
break;
}
// 返回 true: 执行触摸监听操作, false :不执行
return true;
}
});

即:增加cancel方法的条目在方法内实现继续发送切换消息的逻辑。

规则总结:
    1、如果手指缓慢滑动很短的距离,viewpager没有切换界面,所以认为viewPager和view都可以执行事件,系统不会取消任何控件的触摸事件,由我们自己决定处理哪个事件。
    2、如果手指快速滑动很长的距离,viewpager就会执行界面切换,此时view就会执行cancel方法,取消view的触摸事件,只执行viewPager的触摸事件。

ViewPager和View的事件响应规则的更多相关文章

  1. android view、viewgroup 事件响应拦截处理机制

    文章中会用到部分网络资源,首先将原作者的链接附上. 但是还是会附上数量较大的关于此部分内容的自己的思考. ----------------------------------------------- ...

  2. Android艺术开发探索第三章————View的事件体系(下)

    Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动 ...

  3. 简单例子了解View的事件分发

    什么是事件分发 我们在写自定义ViewGroup或者自定义View的时候经常要处理用户的点击事件,如果我们的View在最底层,他在很多ViewGroup里面,我们如何让我们的点击事件准确传递到View ...

  4. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  5. 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系

    本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...

  6. Android艺术开发探索第三章——View的事件体系(上)

    Android艺术开发探索第三章----View的事件体系(上) 我们继续来看这本书,因为有点长,所以又分了上下,你在本片中将学习到 View基础知识 什么是View View的位置参数 Motion ...

  7. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

  8. 三、View的事件体系

    1.View基础知识 1.1.什么是View View是Android中所有控件的基类.View是一种界面层的控件的一种抽象,代表了一个控件.除了View,还有ViewGroup,内部包含了许多个控件 ...

  9. Android View 的事件分发原理解析

    作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...

随机推荐

  1. 用自己的话表达出来-Servlet

    什么是Servlet Servlet就是工作在服务器端的类,该类可以处理用户传过来的请求,也可以通过响应向用户输送数据. 如何使用Servlet Servlet就是处理用户的HTTP请求,然后回送HT ...

  2. Android编程心得-在任意类中获取当前屏幕宽高

    进行Android编程时,很多时候都需要获取当前屏幕的宽度与高度,但是当我们需要在别的类中调用屏幕宽高时,直接用原来的方法是不行的,下面我来介绍如何在任意类中调用宽度高度的两种方法. public v ...

  3. twobin博客样式

    twobin博客样式—“蓝白之风”   自暑假以来,囫囵吞枣一般蒙头栽入前端自学中,且不说是否窥探其道,却不自觉中提高了对网页版面设计的要求,乃至挑剔.一个设计清爽美观的网页能让读者心旷神怡,甚至没有 ...

  4. Asp.Net Web API 2(入门)第一课

    Asp.Net Web API 2(入门)第一课   前言 Http不仅仅服务于Web Pages.它也是一个创建展示服务和数据的API的强大平台.Http是简单的.灵活的.无处不在的.你能想象到几乎 ...

  5. ELF二进制目标文件详解

    以下内容为<<linux内核编程>>笔记 链接程序 找出所有引用的外部模块并链接起来,这些外部模块或函数库一般来自于开发者,操作系统和C运行库. 链接程序取出这些函数库,修订指 ...

  6. XP系统安装ArcGIS10.0需要修改的一个配置

    1,右击我的电脑,查看属性. 2,选择“高级”选项卡,“启动和故障恢复”单击“设置”.   3,在“默认操作系统”中单击“编辑”:   4,在弹出的boot.ini文档中把操作系统改成相应的操作系统, ...

  7. socket网络编程快速上手(二)——细节问题(3)

    3.SIGPIPE问题 人怕牺牲,我们写的程序也一样,人有死不瞑目,程序又何尝不是?程序跑着跑着,突然就崩掉了.好一点的牺牲前告诉你些打印,差点的也能用core文件等一些手段查出死在哪了,最惨不忍睹的 ...

  8. hightchart导出图片

    通常在使用highchart导出图片pdf等文件时,我们一般直接引入exporting.js即可 执行导出操作则会直接请求highchart服务器,执行生成图片等操作,然后下载到客户端: 但这一切的操 ...

  9. 向输出到console的文字加样式

    Chrome 控制台新玩法-向输出到console的文字加样式   有兴趣的同学可以文章最后的代码复制贴到控制台玩玩. Go for Code 在正常模式下,一般只能向console 控制台输出简单的 ...

  10. MYSQL 分表实践

    基本条件: 无索引 主表 test_0 数据:一百万条  数据库引擎 InnoDb 分表 test_1...test_100 数据 每张一万条,一共一百万条  数据库引擎 InnoDb 流程: 主表中 ...