Android里Scroller类是为了实现View平滑滚动的一个Helper类。通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context)。设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。
      相关API介绍如下

  1. mScroller.getCurrX() //获取mScroller当前水平滚动的位置
  2. mScroller.getCurrY() //获取mScroller当前竖直滚动的位置
  3. mScroller.getFinalX() //获取mScroller最终停止的水平位置
  4. mScroller.getFinalY() //获取mScroller最终停止的竖直位置
  5. mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置
  6. mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置
  7. //滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间
  8. mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms
  9. mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)
  10. mScroller.computeScrollOffset() //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。
mScroller.getCurrX() //获取mScroller当前水平滚动的位置
mScroller.getCurrY() //获取mScroller当前竖直滚动的位置
mScroller.getFinalX() //获取mScroller最终停止的水平位置
mScroller.getFinalY() //获取mScroller最终停止的竖直位置
mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置
mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置//滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间
mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms
mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)mScroller.computeScrollOffset() //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。

举例说明,自定义一个CustomView,使用Scroller实现滚动:

  1. import android.content.Context;
  2. import android.util.AttributeSet;
  3. import android.util.Log;
  4. import android.view.View;
  5. import android.widget.LinearLayout;
  6. import android.widget.Scroller;
  7. public class CustomView extends LinearLayout {
  8. private static final String TAG = "Scroller";
  9. private Scroller mScroller;
  10. public CustomView(Context context, AttributeSet attrs) {
  11. super(context, attrs);
  12. mScroller = new Scroller(context);
  13. }
  14. //调用此方法滚动到目标位置
  15. public void smoothScrollTo(int fx, int fy) {
  16. int dx = fx - mScroller.getFinalX();
  17. int dy = fy - mScroller.getFinalY();
  18. smoothScrollBy(dx, dy);
  19. }
  20. //调用此方法设置滚动的相对偏移
  21. public void smoothScrollBy(int dx, int dy) {
  22. //设置mScroller的滚动偏移量
  23. mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
  24. invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
  25. }
  26. @Override
  27. public void computeScroll() {
  28. //先判断mScroller滚动是否完成
  29. if (mScroller.computeScrollOffset()) {
  30. //这里调用View的scrollTo()完成实际的滚动
  31. scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
  32. //必须调用该方法,否则不一定能看到滚动效果
  33. postInvalidate();
  34. }
  35. super.computeScroll();
  36. }
  37. }
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Scroller;public class CustomView extends LinearLayout {private static final String TAG = "Scroller";private Scroller mScroller;public CustomView(Context context, AttributeSet attrs) {super(context, attrs);mScroller = new Scroller(context);}//调用此方法滚动到目标位置public void smoothScrollTo(int fx, int fy) {int dx = fx - mScroller.getFinalX();int dy = fy - mScroller.getFinalY();smoothScrollBy(dx, dy);}//调用此方法设置滚动的相对偏移public void smoothScrollBy(int dx, int dy) {//设置mScroller的滚动偏移量mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果}@Overridepublic void computeScroll() {//先判断mScroller滚动是否完成if (mScroller.computeScrollOffset()) {//这里调用View的scrollTo()完成实际的滚动scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//必须调用该方法,否则不一定能看到滚动效果postInvalidate();}super.computeScroll();}
}

Scroller简单介绍相关推荐

  1. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  2. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  3. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  4. 2021年大数据ELK(二):Elasticsearch简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...

  5. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  6. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  7. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  8. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  9. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

最新文章

  1. Github如何删除repository(仓库)
  2. 粘贴铜箔简易实验电路制作
  3. javascript写打地鼠
  4. linux(1)- 简单的 shell 解释器
  5. 深度解读 OpenYurt :边缘自治能力设计解析
  6. 以太坊智能合约安全入门了解一下(下)
  7. 在穷学生面前 “ 摆弄骚姿 ”,最美90后支教女老师翻车~!这TM就是所谓的 “ 支教媛 ” ~?...
  8. 常用个人密码管理软件 .
  9. 假如你有个不胜任的上司
  10. div 中的i标签如何点击事件_前端优化:语义标签进化史
  11. 有趣的问题:C的表达式x == x,何时为假?!
  12. mac终端 install_Mac常用终端命令
  13. R语言实现随机分组(按照学号或者是姓名随机分组)
  14. 电容式触摸感应按键解决方案AD
  15. 73个GitHub高级搜索技巧
  16. UE4----GC(垃圾回收)
  17. Recoil 的使用
  18. 嘿嘿!报错不断呀!快哉快哉,检测nginx配置文件时报错,整它!
  19. MySQL表的四种分区类型
  20. 物联网LoRa系列-13:无线电磁波概述以及核心概念的澄清(速度、频率、周期、波长、幅度、功率、相位、干涉)

热门文章

  1. 怀孕计算机在线,【孕期天数计算器在线计算_孕期天数计算器在线计算专题】- 天鹅到家...
  2. Git Commit Message校验踩坑指南
  3. luogu P4643 [国家集训队]阿狸和桃子的游戏
  4. Security Warning: The negotiated TLS 1.0 is an insecure protocol and is supported for backward compa
  5. 关于虾皮无货源一件代发你了解多少?详讲虾皮物流发货流程
  6. 读《解忧杂货店》有感
  7. python读取加密excel_python使用pywin32模块给excel文件加密解密
  8. css-盒子模型border-box
  9. 笔记本无线网卡开启wifi方法
  10. C# 调试应用提示“无法访问此网站”问题的处理(图文)