1. package com.melonsapp.messenger.ui.popupuser;
  2.  
  3. import android.os.Handler;
  4. import android.view.View;
  5. import android.view.WindowManager;
  6. import android.view.animation.DecelerateInterpolator;
  7.  
  8. import java.util.Timer;
  9.  
  10. /**
  11. * Created by lidaqiang on 17/5/3.
  12. */
  13.  
  14. public class SmoothScroll {
  15. private Handler mHandler = new Handler();
  16. SmoothScrollThread smoothScrollThread;
  17. public static int noData = ;
  18.  
  19. /**
  20. * @param v 需要操控的视图
  21. * @param fromX 起始Y坐标
  22. * @param toX 终止Y坐标
  23. * @param fps 帧率
  24. * @param durtion 动画完成时间(毫秒)
  25. * @desc 平滑滚动
  26. */
  27. public SmoothScroll(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fps, long durtion) {
  28. this(v, windowManager, windowParams, fromX, toX, noData, noData, , durtion);
  29. }
  30.  
  31. public SmoothScroll(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fromY, int toY, long durtion) {
  32. this(v, windowManager, windowParams, fromX, toX, fromY, toY, , durtion);
  33. }
  34.  
  35. public SmoothScroll(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fromY, int toY, int fps, long durtion) {
  36. smoothScrollThread = new SmoothScrollThread(v, windowManager, windowParams, fromX, toX, fromY, toY, durtion, fps);
  37. }
  38.  
  39. public void start() {
  40. if (smoothScrollThread == null) {
  41. return;
  42. }
  43. smoothScrollThread.run();
  44. }
  45.  
  46. public void stop() {
  47. if (smoothScrollThread == null) {
  48. return;
  49. }
  50. smoothScrollThread.stop();
  51. }
  52.  
  53. /**
  54. * @desc 平滑滚动线程,用于递归调用自己来实现某个视图的平滑滚动
  55. */
  56. class SmoothScrollThread implements Runnable {
  57. WindowManager mWindowManager;
  58. WindowManager.LayoutParams mWindowParams;
  59. //需要操控的视图
  60. private View v = null;
  61. //原X坐标
  62. private int fromX = noData;
  63. //目标X坐标
  64. private int toX = noData;
  65.  
  66. //原Y坐标
  67. private int fromY = noData;
  68. //目标Y坐标
  69. private int toY = noData;
  70. //动画执行时间(毫秒)
  71. private long durtion = ;
  72. //帧率
  73. private int fps = ;
  74. //间隔时间(毫秒),间隔时间 = 1000 / 帧率
  75. private int interval = ;
  76. //启动时间,-1 表示尚未启动
  77. private long startTime = -;
  78. // /减速插值器
  79. private DecelerateInterpolator decelerateInterpolator = null;
  80.  
  81. private int mChangeState = ; // 0 x,y都不变 1 x变 2 y变 3 x,y都变
  82.  
  83. /**
  84. * @desc 构造方法,做好第一次配置
  85. */
  86. public SmoothScrollThread(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fromY, int toY, long durtion, int fps) {
  87. mWindowManager = windowManager;
  88. mWindowParams = windowParams;
  89. this.v = v;
  90. this.fromX = fromX;
  91. this.toX = toX;
  92. this.fromY = fromY;
  93. this.toY = toY;
  94. this.durtion = durtion;
  95. this.fps = fps;
  96. this.interval = / this.fps;
  97. decelerateInterpolator = new DecelerateInterpolator();
  98. mChangeState = ;
  99.  
  100. if (fromX != toX && fromY == toY) {
  101. mChangeState = ;
  102. } else if (fromX == toX && fromY != toY) {
  103. mChangeState = ;
  104. } else if (fromX != toX && fromY != toY) {
  105. mChangeState = ;
  106. }
  107. }
  108.  
  109. @Override
  110. public void run() {
  111.  
  112. if (mChangeState == ) {
  113. return;
  114. }
  115.  
  116. //先判断是否是第一次启动,是第一次启动就记录下启动的时间戳,该值仅此一次赋值
  117. if (startTime == -) {
  118. startTime = System.currentTimeMillis();
  119. }
  120. //得到当前这个瞬间的时间戳
  121. long currentTime = System.currentTimeMillis();
  122. //放大倍数,为了扩大除法计算的浮点精度
  123. int enlargement = ;
  124. //算出当前这个瞬间运行到整个动画时间的百分之多少
  125. float rate = (currentTime - startTime) * enlargement / durtion;
  126. //这个比率不可能在 0 - 1 之间,放大了之后即是 0 - 1000 之间
  127. rate = Math.min(rate, );
  128. //将动画的进度通过插值器得出响应的比率,乘以起始与目标坐标得出当前这个瞬间,视图应该滚动的距离。
  129.  
  130. int currentX = fromX;
  131. if (mChangeState == || mChangeState == ) {
  132. int changeDistanceX = (int) ((fromX - toX) * decelerateInterpolator.getInterpolation(rate / enlargement));
  133. currentX = fromX - changeDistanceX;
  134. }
  135.  
  136. int currentY = fromY;
  137. if (mChangeState == || mChangeState == ) {
  138. int changeDistanceY = (int) ((fromY - toY) * decelerateInterpolator.getInterpolation(rate / enlargement));
  139. currentY = fromY - changeDistanceY;
  140. }
  141.  
  142. notifyViewLayout(currentX, currentY);
  143.  
  144. if (currentX != toX || currentY != toY) {
  145.  
  146. mHandler.postDelayed(this, this.interval);
  147. } else {
  148. return;
  149. }
  150. }
  151.  
  152. private void notifyViewLayout(int currentX, int currentY) {
  153. // v.scrollTo(0, currentY);
  154. if (mWindowParams == null || mWindowParams == null || v == null) {
  155. return;
  156. }
  157.  
  158. if (mChangeState == || mChangeState == ) {
  159. mWindowParams.x = currentX;
  160. }
  161.  
  162. if (mChangeState == || mChangeState == ) {
  163. mWindowParams.y = currentY;
  164. }
  165.  
  166. if (v.getParent() != null) {
  167. mWindowManager.updateViewLayout(v, mWindowParams);
  168. }
  169.  
  170. }
  171.  
  172. public void stop() {
  173. mHandler.removeCallbacks(this);
  174. }
  175. }
  176.  
  177. }

android开发教程之使用线程实现视图平滑滚动示例 改的更多相关文章

  1. android开发教程之使用线程实现视图平滑滚动示例

    最近一直想做下拉刷新的效果,琢磨了好久,才走到通过onTouch方法把整个视图往下拉的步骤,接下来就是能拉下来,松开手要能滑回去啊.网上看了好久,没有找到详细的下拉刷新的例子,只有自己慢慢琢磨了.昨天 ...

  2. Android开发教程大全介绍

    Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...

  3. ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map

    原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...

  4. ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView

    原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http:/ ...

  5. ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置

    原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...

  6. ArcGIS Runtime for Android开发教程V2.0(1)基本概念

    原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csd ...

  7. 【Android 开发教程】动态添加Fragments

    本章节翻译自<Beginning-Android-4-Application-Development>,如有翻译不当的地方,敬请指出. 原书购买地址http://www.amazon.co ...

  8. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  9. Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据

    原文 Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据 第12部分:改进视图模型和示例数据 原文地址:http://channel9.msdn.com/Series/Win ...

随机推荐

  1. linux中添加一个用户到指定用户组的两种方式,修改一个用户到指定用户组的一种方式

    添加一个用户到指定用户组: gpasswd –a 用户名 组名usermod –G 组名 用户名 //第一种:gpasswd –a 用户名 组名 [root@localhost ~]# id user ...

  2. (35)zabbix Event acknowledgment事件确认

    概述 以往服务器出现报警,运维人员处理完事之后,报警自动取消,但是下一次出现同样一个错误,但是换了一个运维人员,他可能需要重新排查问题,直到问题处理完毕. 针对这种情况,zabbix提供了event ...

  3. svn设置提交时忽略某些文件

    一.在资源管理器中,右键一个未加入版本控制文件或目录,并从弹出菜单选择TortoiseSVN →Add to Ignore List,会出现一个子菜单,允许你仅选择该文件或者所有具有相同后缀的文件. ...

  4. perl学习之:read

    perl read()函数例子,read()函数实例代码 - 读取,或试图读取,长度LENGTH 与文件句柄FILEHANDLE 相关联的文件到缓冲区BUFFER中的字节数. 语法 read FILE ...

  5. Python中单元测试出错了,会怎么样?

    在上一篇中,我们看到了单元测试正常通过时的情况,如果我们边修改一下要测试的函数,然后再运行单元测试,会出现什么情况. 原say_hello_name.py def hello_name(name): ...

  6. Java面试——从JVM角度比较equals和==的区别

    1.  Java中数据类型分类 1.1    基本数据类型 又称为原始数据类型,byte,short,char,int,long,float,double,boolean,他们之间的比较应该使用(== ...

  7. IIS PUT

    测试版本:IIS6.0 利用工具 1.IIS PUT Scaner By ZwelL 2.桂林老兵IIS写权限利用程序   -------------------------------------- ...

  8. scp命令(基于ssh上传文件等)

    (转:http://www.cnblogs.com/hitwtx/archive/2011/11/16/2251254.html) svn 删除所有的 .svn文件 find . -name .svn ...

  9. 【BZOJ3991】寻宝游戏(虚树,DFS序,splay)

    题意:求在树中从任意点开始,经过若干个关键点回到原点的最小距离 要求支持在线将某个点设置(取消)为关键点,以及询问答案 n,m<=100000 len[i]<=10^9 思路:显然是一个虚 ...

  10. Unslider--入门篇

    Unslider--入门篇 背景:因工作需求,需要完成一个图片轮播效果,因博主不是专业的前端开发人员,so google之,经过挑选最终选择使用Unslider插件完成工作. 一.Unslider插件 ...