之前说的scrollTo和scrollBy确实可以实现View的滚动,但我们要想让View像我们常见的ViewPager那样平滑的滚动,只用这两方法是做不多的,因为它们产生的滚动是不连贯的,闪烁的,所以系统也为我们提供了Scroller这个类来实现View的平滑滚动

Scroller典型用法

Scroller mScroller = new Scroller(mContext);private void smoothScroll(int destX, int destY) {int scrollX = getScrollX();int deltaX = destX - scrollX;mScroller.startScroll(scrollX, 0, deltaX, 0, 500);invalidate();}@Overridepublic void computeScroll() {super.computeScroll();if (mScroller.computeScrollOffset()) {scrollTo(mScroller.getCurrX(), mScroller.getCurrY());invalidate();}}

根据上面的代码可把Scroller的使用概括为以下五个主要步骤

  1. 初始化Scroller
  2. 调用startScroll()开始滚动
  3. 执行invalidate()刷新界面
  4. 重写View的computeScroll()并在其内部实现与滚动相关的业务逻辑
  5. 再次执行invalidate()刷新界面

我们知道手机屏幕左上角为原点(0,0)

创建一些子View的时候,就会有一些超过屏幕的区域,可正可负,如图所示

getScrollX():屏幕原点X坐标减去调用视图左上角X坐标,例如蓝色图得到的为0-(-480)=480

getScrollY():屏幕原点Y坐标减去调用视图左上角Y坐标,例如蓝色图得到的为0-0=0

mScroller.startScroll(int startX,int startY,int dx,int dy)

startX:表示View X坐标滚动的开始位置;
startY:表示View Y坐标滚动的开始位置 
dx:表示View 从X坐标的开始位置需要滚动的距离(这里dx的正负是和ScrllTo() 的x一样的)
dy:表示View 从Y坐标开始位置需要滚动的距离(dy的正负和scrllTo的 y 一样的)

startScroll源码

/*** Start scrolling by providing a starting point, the distance to travel,* and the duration of the scroll.* * @param startX Starting horizontal scroll offset in pixels. Positive*        numbers will scroll the content to the left.* @param startY Starting vertical scroll offset in pixels. Positive numbers*        will scroll the content up.* @param dx Horizontal distance to travel. Positive numbers will scroll the*        content to the left.* @param dy Vertical distance to travel. Positive numbers will scroll the*        content up.* @param duration Duration of the scroll in milliseconds.*/public void startScroll(int startX, int startY, int dx, int dy, int duration) {mMode = SCROLL_MODE;mFinished = false;mDuration = duration;mStartTime = AnimationUtils.currentAnimationTimeMillis();mStartX = startX;mStartY = startY;mFinalX = startX + dx;mFinalY = startY + dy;mDeltaX = dx;mDeltaY = dy;mDurationReciprocal = 1.0f / (float) mDuration;}

通过源码可以看到,当调用startScroll()时,内部并没有做什么滚动的操作,只是做了赋值的操作,所以当调用了这段代码之后,
我们需要调用invalidate()方法来让View重绘从而调用View里computeScroll()方法,在View源码里computeScroll()方法是个空实现,所以我们可以在这个方法里面做滚动的逻辑

例如:

public void computeScroll(){if (mScroller.computeScrollOffset()) {scrollTo(0, mScroller.getCurrY());postInvalidate();}super.computeScroll();
}

computeScroll()方法里,我们一般用mScroller.compuScrollOffset()来判断View的滚动是否在继续,返回true表示还在继续,false 表示结束

DEMO

Demo下载地址

Scroller简介相关推荐

  1. dev控件swiftplot图滚动方法_无限轮播图使用Scroller就这么简单

    前言 这几天又拾起老本行,复习复习Android,才发现忘的差不多了,上午做了一个小Demo,配合Scroller做了一个轮播图,效果如下,但是不知为何,录制的GIF成这样,凑乎一下看看. 原理是继承 ...

  2. weex scroller滚动列表实践

    weex 提供了<scroller>滚动组件,可以容纳子组件进行横向或竖向滚动.如果组件需要进行滚动,可以将 <scroller>当作根元素或者父元素使用,否则页面无法滚动(  ...

  3. 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件

    博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.c ...

  4. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  5. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  6. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  7. TensorRT简介

    TensorRT 介绍 引用:https://arleyzhang.github.io/articles/7f4b25ce/ 1 简介 TensorRT是一个高性能的深度学习推理(Inference) ...

  8. 谷粒商城学习笔记——第一期:项目简介

    一.项目简介 1. 项目背景 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O B2B 模式(Business to Business),是指商家和商家建立的商业关系.如阿里巴巴 B ...

  9. 通俗易懂的Go协程的引入及GMP模型简介

    本文根据Golang深入理解GPM模型加之自己的理解整理而来 Go协程的引入及GMP模型 一.协程的由来 1. 单进程操作系统 2. 多线程/多进程操作系统 3. 引入协程 二.golang对协程的处 ...

最新文章

  1. 线上比赛投诉:同一赛点两支队伍比赛车模是否相同?
  2. 【 MATLAB 】gallery 中的 uniformdata
  3. php大于等于符号怎么打出来_PHP常用的特殊运算符号(连续小于符号,三个小于符号,eot,eod,echo示例,print示例)...
  4. 超便携式截屏录屏软件FastStone Capture
  5. SAP ABAP Netweaver服务器的标准登录方式讲解
  6. 属性被分为八大类不包括_家庭软装八大类有哪些 软装八大类风格有什么特点...
  7. linux sudo 命令权限,linux su和sudo命令的区别
  8. 从石头剪刀布浅谈算法的作用
  9. seq2seq模型_用 CNN 实现 Seq2Seq 模型
  10. atom编辑器 apm指令配置代理
  11. Linux下svn的部署
  12. 基于spring reactor3构建的即时通讯api。
  13. Java新手入门值得看的五本书!
  14. 在开发板显示24位的bmp格式图片
  15. SPF(最短路径树)算法
  16. 类动态规划求解较小规模的最大团问题(Python实现)
  17. position的8种定位方式
  18. 第八章第六题(代数:两个矩阵相乘的方法)(Algebra: a method of multiplying two matrices)
  19. 前端开发:npm install 报错npm ERR! Cannot read property ‘extraneous‘ of undefined的解决方法
  20. java的protect_java的public,protect,缺省,private修饰符的访问权限

热门文章

  1. MPEG最新进展 - 20191110
  2. LDAP批量添加php页面,包含邮件发送
  3. PTA7-22 龟兔赛跑
  4. 鸿蒙造化塔之秘,鸿蒙之始,天地之秘;生生不息,亘古不易;天为之天,地为之地;生为之续,死为之继;玲珑九转,造化之意;的作者、出处以及相似句子__句子大全...
  5. Fuchsia 系统的编译和探索
  6. 中国移动光猫 GM220-S 改桥接简易教程(安徽移动)
  7. Linux基础命令(管理工具)
  8. windows截图指令命令/cmd中截图指令
  9. mac下chrome插件安装位置
  10. Python第一周学习总结