热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android使用Scroller实现弹性滑动效果

这篇文章主要介绍了Android使用Scroller实现弹性滑动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android使用Scroller实现弹性滑动展示的具体代码,供大家参考,具体内容如下

scrollTo、scrollBy

View内部为了实现滑动提供了这两个方法,但是使用这两个方法滑动的效果是瞬间的不够平滑,如何实现View的弹性滑动呢?这正是本博文讨论的主题。另外这两个函数滑动的是View的内容不是View本身。比如对于普通View好比TextView其内容就是文本,ImageView的内容则是drawable对象,采用这两种方法滑动的时候其实分别滑动的是文本及drawable对象,对于ViewGroup采用这两种方法滑动的时候则是对其子元素的滑动。所以想要使用scrollTo、scrollBy方法实现拖动View(指的是普通的View不包含ViewGroup)的效果必须在View外面在包一层ViewGroup。

Scroller类

上面提到使用scrollTo、scrollBy来滑动View的时候是很生硬得滑过去的,不够平滑,自然用户体验也不好,因此我们要实现一个弹性的滑动。如何实现弹性滑动呢?方法有很多,但思想都是一致的,即将实现一段距离的滑动分成多次来进行,每一次滑动一小段,渐近式的滑动。本文只是介绍其中的一种即使用Scroller实现弹性滑动。以下结合实例看看Scroller是如何实现平滑滑动的呢 ?

public class SmoothScrollView extends LinearLayout{ 
 
  Scroller mScroller ; 
  int startX; 
  int startY; 
public SmoothScrollView(Context context, AttributeSet attrs) { 
  super(context, attrs); 
  //创建Scroller实例 
  mScroller = new Scroller(context); 
  } 
 
 
public void smoothScroll(int dx,int dy,int duration){ 
  //获取滑动起点坐标 
  startX = getScrollX(); 
  startY = getScrollY(); 
  //设置滑动参数 
  mScroller.startScroll(startX,startY,dx,dy,duration); 
  //重新绘制View 
  invalidate(); 
  } 
 
@Override 
public void computeScroll() { 
  // TODO Auto-generated method stub 
  super.computeScroll(); 
  boolean flag = mScroller.computeScrollOffset(); 
  //递归终止条件:滑动结束 
  if(flag == false){ 
    return; 
  }else{ 
  //mScroller.getCurrX(),mScroller.getCurrY()记录的是此刻要滑动达到的目标坐标 
  scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); 
  } 
  //递归调用 
  invalidate();//或者postInvalidate() 
  } 
} 

 看到第9行,首先在SmoothScrollView内部创建一个Scroller对象,第13行的smoothScroll方法是实现SmoothScrollView的平滑滑动,可以看到实现平滑滑动首先调用第18行Scroller的startScroll方法来设置滑动参数,下文会分析这个方法,这里先放一放。然后在第20行调用invalidate方法,这个方法会导致SmoothScrollView重绘,从而调用draw方法之后又会调用computeScroll方法,在第24行可以看到这里重写了computeScroll方法,因此调用invalidate方法最终会导致computeScroll方法被调用。第27~29行调用Scroller的computeScrollOffeset方法并判断是否滑动结束,computeScrollOffset是如何判断滑动结束的呢?这里也先放一放下文在分析。如果滑动未结束,执行第33行调用scrollTo滑动SmoothScrollView至此刻目的坐标,然后递归调用invalidate方法。

以下是对Scroller几个方法的分析:

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; 
  //mDuration表示的是整个滑动持续的时间 
    mDuratiOnReciprocal= 1.0f / (float) mDuration; 
  } 

从以上代码可以看到startScroll方法其实根本没有滑动View只是对滑动参数进行设置。往下再来看看computeScrollOffset方法,computeScrollOffset返回true则表示滑动还没结束返回false表示滑动结束,它的实现如下:
[java] view plain copy

public boolean computeScrollOffset() { 
    if (mFinished) { 
      return false; 
    } 
 
    int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime); 
   //判断此刻是否在有效滚动周期内 
    if (timePassed 

看到这我们应该明白SmoothScrollView是如何实现让自己平滑滑动的呢?实际上正真让SmoothScrollView产生平滑滑动的并非是Scroller而是SmoothScrollView自己,是SmoothScrollView自己多次调用了自己的scrollerTo方法并且每次滑动一小步从而实现平滑滑动,而Scroller类干的事只是辅助SmoothScrollView计算每一次小滑动要到达的目标坐标,而实现多次调用了自己的scrollerTo方法这里没有使用循环体则是利用程序设计技巧“递归调用”invalidate方法达到多次调用scrollTo方法的目的从而实现平滑滑动。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
author-avatar
丹丹2502912601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有