一个native crash最后是重写ViewPager解决的,过程中发现这三个回调还有点绕,于是理了一下

ViewPager有两个操作,一个是用手指滑动翻页,一个是直接setCurrentItem(一般用于点击上面的tab直接setCurrentItem)。下面的方法介绍也会针对这两种情况分别介绍。

onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
  1. 这个方法会在屏幕滚动过程中不断被调用
  2. 第一个position(这个参数要特别注意一下):位置
    1. 当用手指滑动时
      1. 如果手指按在页面上不动,position和当前页面index是一致的
      2. 如果手指向左拖动(相应页面向右翻动),这时候position大部分时间和当前页面是一致的,只有翻页成功的情况下最后一次调用才会变为目标页面
      3. 如果手指向右拖动(相应页面向左翻动),这时候position大部分时间和目标页面是一致的,只有翻页不成功的情况下最后一次调用才会变为原页面
    2. 当直接设置setCurrentItem翻页时
      1. 如果是相邻的情况(比如现在是第二个页面,跳到第一或者第三个页面)
        1. 如果页面向右翻动,大部分时间是和当前页面是一致的,只有最后才变成目标页面
        2. 如果向左翻动,position和目标页面是一致的。这和用手指拖动页面翻动是基本一致的。
      2. 如果不是相邻的情况
        1. 比如我从第一个页面跳到第三个页面,position先是0,然后逐步变成1,然后逐步变成2
        2. 我从第三个页面跳到第一个页面,position先是1,然后逐步变成0,并没有出现为2的情况
  3. positionOffset:当前页面因滑动而偏移了多少比例
    1. 如果页面向右翻动,这个值不断变大,最后在趋近1的情况后突变为0
    2. 如果页面向左翻动,这个值不断变小,最后变为0。
  4. positionOffsetPixels:当前页面因滑动而偏移了多少像素
    1. 变化情况和positionOffset一致
  5. 一次滑动实例:

onPageSelected(int position)
  1. 共同
    1. position是滑动结果,也就是新页面的的index
    2. 必须切到一个跟上一个不一样的页面才会调用(另两个不需要)
  2. 手指滑动
    1. 用手指滑动翻页的时候,如果翻动成功了(滑动的距离够长),手指抬起来一瞬间就会立即执行这个方法,不是在滑动结束的时候回调
  3. setCurrentItem翻页
    1. 这种情况在onPageScrolled执行方法前就会立即执行
 

onPageScrollStateChanged(int state)
  1. 共同
    1. state有三个值:0(END),1(PRESS) , 2(UP)
  2. 手指滑动
    1. (滑动时)手指按下去的时候会触发这个方法,state值为1
    2. 手指抬起时,如果发生了滑动(即使很小),就会触发这个方法,这个值会变为2
    3. 最后滑动结束,页面停止的时候,也会触发这个方法,值变为0
    4. 所以一次手指滑动会执行这个方法三次
    5. 一种特殊情况是手指按下去以后一点滑动也没有发生,这个时候只会调用这个方法两次,state值分别是1,0
  3. setCurrentItem翻页
    1. 会执行这个方法两次,state值分别为2 , 0

 
用手指拖动翻页时,三个方法的执行顺序为:
  1. 最先执行一遍onPageScrollStateChanged(1)
  2. 然后不断执行onPageScrolled
  3. 放手指的时候,直接立即执行一次onPageScrollStateChanged(2)
  4. 然后立即执行一次onPageSelected
  5. 然后再不断执行onPageScrolled
  6. 最后执行一次onPageScrollStateChanged(0)

ViewPager的OnPageChangeListener三个回调解析的更多相关文章

  1. [教程]Delphi 中三种回调函数形式解析

    Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...

  2. JSON三种数据解析方法(转)

    原 JSON三种数据解析方法 2018年01月15日 13:05:01 zhoujiang2012 阅读数:7896    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  3. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  4. iOS_Swift初识之使用三种回调方式自定义Button

    最近在学习Swift ,发现青玉伏案大神早期用OC写的一篇博客--IOS开发之自定义Button(集成三种回调模式)  很适合用来熟悉Swift的回调方式,于是我就用Swift翻版了一下,具体实现原理 ...

  5. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  6. iOS网络编程解析协议三:JSON数据传输解析

    作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...

  7. iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍

    网络编程:HTTP协议.XML数据协议.JSON数据协议: HTTP: 1.HTTP传输数据有四种方式:Get方式.Post方式.同步请求方式.异步请求方式. 说明:同步和异步请求方式在创建链接对象和 ...

  8. android ViewPager之OnPageChangeListener接口

    项目中在使用ViewPager的时候,一般都要在界面滑动的时候做一些事情,android中有个专门的状态回调接口OnPageChangeListener. /** * Callback interfa ...

  9. SDN三种模型解析

    数十年前,计算机科学家兼网络作家Andrew S. Tanenbaum讽刺标准过多难以选择,当然现在也是如此,比如软件定义网络模型的数量也很多.但是在考虑部署软件定义网络(SDN)或者试点之前,首先需 ...

随机推荐

  1. 使用pyinotify监控文件系统的变化

    pyinotify依赖Linux内核inotify功能,它需要在2.6.13版本的内核的Linux系统上运行. 1. 安装pyinotify pip install pyinotify 安装完后可以直 ...

  2. Android5.x新特性之 Toolbar和Theme的使用

    Toolbar 你还在为Android 的ActionBar的文字不能随意设置位置而烦恼么?你还在为ActionBar不能自定义添加自己的布局而烦恼么?现在告诉你一个好消息,当你看到这篇文章时,就不必 ...

  3. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  4. 执行上下文、this

    1.js中的执行上下文或者执行环境:execution context,简称EC; 2. console.log(a);//undefined var a=200; fn('lili'); funct ...

  5. Matlab 三维绘图与统计绘图

    一. 三维绘图 p = : pi/: *pi; x = cos(p); y = sin(p); z = p; plot3(x,y,z) x = -:.:; %有-2为起点,2为递增步长,2为终止点 y ...

  6. 【laravel5.6】laravel 自定义公共函数

    1.在 app/Helpers/ 新建一个文件 functions.php,当然这个文件位置和名称你可以自己定义,创建一些函数用于全局调用: 2.在composer.json中的autoload下增加 ...

  7. 【cs229-Lecture2】Linear Regression with One Variable (Week 1)(含测试数据和源码)

    从Ⅱ到Ⅳ都在讲的是线性回归,其中第Ⅱ章讲得是简单线性回归(simple linear regression, SLR)(单变量),第Ⅲ章讲的是线代基础,第Ⅳ章讲的是多元回归(大于一个自变量). 本文的 ...

  8. 云计算设计模式(六)——命令和查询职责分离(CQRS)模式

    云计算设计模式(六)——命令和查询职责分离(CQRS)模式 隔离,通过使用不同的接口,从操作读取数据更新数据的操作.这种模式可以最大限度地提高性能,可扩展性和安全性;支持系统在通过较高的灵活性,时间的 ...

  9. 转载>>六款大数据采集平台的架构分析

    随着大数据越来越被重视,数据采集的挑战变的尤为突出.今天为大家介绍几款数据采集平台: Apache Flume Fluentd Logstash Chukwa Scribe Splunk Forwar ...

  10. Ubuntu 14.04 LTS 火狐浏览器中,鼠标选择文字被删除的解决办法

    这篇文章主要介绍了Ubuntu 火狐浏览器中,鼠标选择文字被删除的解决办法,需要的朋友可以参考下在终端中输入命令: ibus-setup将 “在应用程序窗口中启用内嵌编辑模式“ 选项取消