ViewPager的OnPageChangeListener三个回调解析
一个native crash最后是重写ViewPager解决的,过程中发现这三个回调还有点绕,于是理了一下
ViewPager有两个操作,一个是用手指滑动翻页,一个是直接setCurrentItem(一般用于点击上面的tab直接setCurrentItem)。下面的方法介绍也会针对这两种情况分别介绍。
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
- 这个方法会在屏幕滚动过程中不断被调用
- 第一个position(这个参数要特别注意一下):位置
- 当用手指滑动时
- 如果手指按在页面上不动,position和当前页面index是一致的
- 如果手指向左拖动(相应页面向右翻动),这时候position大部分时间和当前页面是一致的,只有翻页成功的情况下最后一次调用才会变为目标页面
- 如果手指向右拖动(相应页面向左翻动),这时候position大部分时间和目标页面是一致的,只有翻页不成功的情况下最后一次调用才会变为原页面
- 当直接设置setCurrentItem翻页时
- 如果是相邻的情况(比如现在是第二个页面,跳到第一或者第三个页面)
- 如果页面向右翻动,大部分时间是和当前页面是一致的,只有最后才变成目标页面
- 如果向左翻动,position和目标页面是一致的。这和用手指拖动页面翻动是基本一致的。
- 如果不是相邻的情况
- 比如我从第一个页面跳到第三个页面,position先是0,然后逐步变成1,然后逐步变成2
- 我从第三个页面跳到第一个页面,position先是1,然后逐步变成0,并没有出现为2的情况
- positionOffset:当前页面因滑动而偏移了多少比例
- 如果页面向右翻动,这个值不断变大,最后在趋近1的情况后突变为0
- 如果页面向左翻动,这个值不断变小,最后变为0。
- positionOffsetPixels:当前页面因滑动而偏移了多少像素
- 变化情况和positionOffset一致
- 一次滑动实例:

onPageSelected(int position)
- 共同
- position是滑动结果,也就是新页面的的index
- 必须切到一个跟上一个不一样的页面才会调用(另两个不需要)
- 手指滑动
- 用手指滑动翻页的时候,如果翻动成功了(滑动的距离够长),手指抬起来一瞬间就会立即执行这个方法,不是在滑动结束的时候回调
- setCurrentItem翻页
- 这种情况在onPageScrolled执行方法前就会立即执行
onPageScrollStateChanged(int state)
- 共同
- state有三个值:0(END),1(PRESS) , 2(UP)
- 手指滑动
- (滑动时)手指按下去的时候会触发这个方法,state值为1
- 手指抬起时,如果发生了滑动(即使很小),就会触发这个方法,这个值会变为2
- 最后滑动结束,页面停止的时候,也会触发这个方法,值变为0
- 所以一次手指滑动会执行这个方法三次
- 一种特殊情况是手指按下去以后一点滑动也没有发生,这个时候只会调用这个方法两次,state值分别是1,0
- setCurrentItem翻页
- 会执行这个方法两次,state值分别为2 , 0
- 最先执行一遍onPageScrollStateChanged(1)
- 然后不断执行onPageScrolled
- 放手指的时候,直接立即执行一次onPageScrollStateChanged(2)
- 然后立即执行一次onPageSelected
- 然后再不断执行onPageScrolled
- 最后执行一次onPageScrollStateChanged(0)
ViewPager的OnPageChangeListener三个回调解析的更多相关文章
- [教程]Delphi 中三种回调函数形式解析
Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...
- JSON三种数据解析方法(转)
原 JSON三种数据解析方法 2018年01月15日 13:05:01 zhoujiang2012 阅读数:7896 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- IOS开发之自定义Button(集成三种回调模式)
前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...
- iOS_Swift初识之使用三种回调方式自定义Button
最近在学习Swift ,发现青玉伏案大神早期用OC写的一篇博客--IOS开发之自定义Button(集成三种回调模式) 很适合用来熟悉Swift的回调方式,于是我就用Swift翻版了一下,具体实现原理 ...
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...
- iOS网络编程解析协议三:JSON数据传输解析
作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...
- iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍
网络编程:HTTP协议.XML数据协议.JSON数据协议: HTTP: 1.HTTP传输数据有四种方式:Get方式.Post方式.同步请求方式.异步请求方式. 说明:同步和异步请求方式在创建链接对象和 ...
- android ViewPager之OnPageChangeListener接口
项目中在使用ViewPager的时候,一般都要在界面滑动的时候做一些事情,android中有个专门的状态回调接口OnPageChangeListener. /** * Callback interfa ...
- SDN三种模型解析
数十年前,计算机科学家兼网络作家Andrew S. Tanenbaum讽刺标准过多难以选择,当然现在也是如此,比如软件定义网络模型的数量也很多.但是在考虑部署软件定义网络(SDN)或者试点之前,首先需 ...
随机推荐
- SpringBoot(一)-- 知识点介绍
一.简介 Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置.简单来说,它提供了一堆依赖打包,并 ...
- 关于OSG+QT+VS版本的问题
CMake3.10.0 Qt5.11.0安装包只有VS2017_64版本,没有VS2017的32位版本,有VS2015的32位版本 Qt5.11.0+osg3.4在CMake的时候,会出现 CMake ...
- C# mvc 500 内部服务器访问异常
20161018 项目发布到IIS上后,无法访问,由于页面默认跳转到异常处理去了,所以详细信息一直查看不了. 在找寻无果,异常信息日志记录无效的情况下,只好一点点来测试了 在异常处理前,就已经试过,a ...
- Qt编写机房安全作业预警系统
最近给一个朋友做了个项目,运行在一个日本大型企业中,大屏显示.机房安全作业预警系统工事主要是由监控系统和报警系统组成.其目的就是通过监控系统实时观察空压机房内的动态,通过报警系统确认空压机房在规定的时 ...
- vue - 父组件数据变化控制子组件类名切换
先说当时的思路和实现核心是父子组件传值和v-bind指令动态绑定class实现 1. 父组件引用.注册.调用子组件script中引用 import child from '../components/ ...
- 原生js--http请求
1.终止请求和超时 终止请求XMLHttpRequest对象提供abort方法,调用该方法时触发abort事件 XHR2提供了timeout属性,当超时发生时触发timeout事件.但浏览器尚不支持自 ...
- php-config
php-config php-config 是一个简单的命令行脚本用于获取所安装的 PHP 配置的信息. 在编译扩展时,如果安装有多个 PHP 版本,可以在配置时用 --with-php-config ...
- 4606: [Apio2008]DNA
4606: [Apio2008]DNA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 63 Solved: 36[Submit][Status][D ...
- Particle 粒子效果使用(适配微信小游戏,particle is not defined)
在微信小游戏中使用粒子效果 参考: 1. 粒子库下载地址 2. 粒子官方使用教程 3. 水友解决微信小游戏particle is not defined 一.下载第三方库 Git地址:https:// ...
- Excel 2007表格内输入http取消自动加上超链接的功能
经常使用Excel表格工作的也许会发现,当我们在表格内输入http://XXXX时,默认情况下都会自动加上超链接,如下: 当我们点击域名准备编辑修改时,往往都会调用浏览器转到该域名之下,达不到编辑修改 ...