android开发教程之使用线程实现视图平滑滚动示例 改
- package com.melonsapp.messenger.ui.popupuser;
- import android.os.Handler;
- import android.view.View;
- import android.view.WindowManager;
- import android.view.animation.DecelerateInterpolator;
- import java.util.Timer;
- /**
- * Created by lidaqiang on 17/5/3.
- */
- public class SmoothScroll {
- private Handler mHandler = new Handler();
- SmoothScrollThread smoothScrollThread;
- public static int noData = ;
- /**
- * @param v 需要操控的视图
- * @param fromX 起始Y坐标
- * @param toX 终止Y坐标
- * @param fps 帧率
- * @param durtion 动画完成时间(毫秒)
- * @desc 平滑滚动
- */
- public SmoothScroll(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fps, long durtion) {
- this(v, windowManager, windowParams, fromX, toX, noData, noData, , durtion);
- }
- public SmoothScroll(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fromY, int toY, long durtion) {
- this(v, windowManager, windowParams, fromX, toX, fromY, toY, , durtion);
- }
- public SmoothScroll(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fromY, int toY, int fps, long durtion) {
- smoothScrollThread = new SmoothScrollThread(v, windowManager, windowParams, fromX, toX, fromY, toY, durtion, fps);
- }
- public void start() {
- if (smoothScrollThread == null) {
- return;
- }
- smoothScrollThread.run();
- }
- public void stop() {
- if (smoothScrollThread == null) {
- return;
- }
- smoothScrollThread.stop();
- }
- /**
- * @desc 平滑滚动线程,用于递归调用自己来实现某个视图的平滑滚动
- */
- class SmoothScrollThread implements Runnable {
- WindowManager mWindowManager;
- WindowManager.LayoutParams mWindowParams;
- //需要操控的视图
- private View v = null;
- //原X坐标
- private int fromX = noData;
- //目标X坐标
- private int toX = noData;
- //原Y坐标
- private int fromY = noData;
- //目标Y坐标
- private int toY = noData;
- //动画执行时间(毫秒)
- private long durtion = ;
- //帧率
- private int fps = ;
- //间隔时间(毫秒),间隔时间 = 1000 / 帧率
- private int interval = ;
- //启动时间,-1 表示尚未启动
- private long startTime = -;
- // /减速插值器
- private DecelerateInterpolator decelerateInterpolator = null;
- private int mChangeState = ; // 0 x,y都不变 1 x变 2 y变 3 x,y都变
- /**
- * @desc 构造方法,做好第一次配置
- */
- public SmoothScrollThread(View v, WindowManager windowManager, WindowManager.LayoutParams windowParams, int fromX, int toX, int fromY, int toY, long durtion, int fps) {
- mWindowManager = windowManager;
- mWindowParams = windowParams;
- this.v = v;
- this.fromX = fromX;
- this.toX = toX;
- this.fromY = fromY;
- this.toY = toY;
- this.durtion = durtion;
- this.fps = fps;
- this.interval = / this.fps;
- decelerateInterpolator = new DecelerateInterpolator();
- mChangeState = ;
- if (fromX != toX && fromY == toY) {
- mChangeState = ;
- } else if (fromX == toX && fromY != toY) {
- mChangeState = ;
- } else if (fromX != toX && fromY != toY) {
- mChangeState = ;
- }
- }
- @Override
- public void run() {
- if (mChangeState == ) {
- return;
- }
- //先判断是否是第一次启动,是第一次启动就记录下启动的时间戳,该值仅此一次赋值
- if (startTime == -) {
- startTime = System.currentTimeMillis();
- }
- //得到当前这个瞬间的时间戳
- long currentTime = System.currentTimeMillis();
- //放大倍数,为了扩大除法计算的浮点精度
- int enlargement = ;
- //算出当前这个瞬间运行到整个动画时间的百分之多少
- float rate = (currentTime - startTime) * enlargement / durtion;
- //这个比率不可能在 0 - 1 之间,放大了之后即是 0 - 1000 之间
- rate = Math.min(rate, );
- //将动画的进度通过插值器得出响应的比率,乘以起始与目标坐标得出当前这个瞬间,视图应该滚动的距离。
- int currentX = fromX;
- if (mChangeState == || mChangeState == ) {
- int changeDistanceX = (int) ((fromX - toX) * decelerateInterpolator.getInterpolation(rate / enlargement));
- currentX = fromX - changeDistanceX;
- }
- int currentY = fromY;
- if (mChangeState == || mChangeState == ) {
- int changeDistanceY = (int) ((fromY - toY) * decelerateInterpolator.getInterpolation(rate / enlargement));
- currentY = fromY - changeDistanceY;
- }
- notifyViewLayout(currentX, currentY);
- if (currentX != toX || currentY != toY) {
- mHandler.postDelayed(this, this.interval);
- } else {
- return;
- }
- }
- private void notifyViewLayout(int currentX, int currentY) {
- // v.scrollTo(0, currentY);
- if (mWindowParams == null || mWindowParams == null || v == null) {
- return;
- }
- if (mChangeState == || mChangeState == ) {
- mWindowParams.x = currentX;
- }
- if (mChangeState == || mChangeState == ) {
- mWindowParams.y = currentY;
- }
- if (v.getParent() != null) {
- mWindowManager.updateViewLayout(v, mWindowParams);
- }
- }
- public void stop() {
- mHandler.removeCallbacks(this);
- }
- }
- }
android开发教程之使用线程实现视图平滑滚动示例 改的更多相关文章
- android开发教程之使用线程实现视图平滑滚动示例
最近一直想做下拉刷新的效果,琢磨了好久,才走到通过onTouch方法把整个视图往下拉的步骤,接下来就是能拉下来,松开手要能滑回去啊.网上看了好久,没有找到详细的下拉刷新的例子,只有自己慢慢琢磨了.昨天 ...
- Android开发教程大全介绍
Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...
- ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map
原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...
- ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView
原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http:/ ...
- ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置
原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...
- ArcGIS Runtime for Android开发教程V2.0(1)基本概念
原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csd ...
- 【Android 开发教程】动态添加Fragments
本章节翻译自<Beginning-Android-4-Application-Development>,如有翻译不当的地方,敬请指出. 原书购买地址http://www.amazon.co ...
- 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。
AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...
- Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据
原文 Windows Phone 8初学者开发—第12部分:改进视图模型和示例数据 第12部分:改进视图模型和示例数据 原文地址:http://channel9.msdn.com/Series/Win ...
随机推荐
- linux中添加一个用户到指定用户组的两种方式,修改一个用户到指定用户组的一种方式
添加一个用户到指定用户组: gpasswd –a 用户名 组名usermod –G 组名 用户名 //第一种:gpasswd –a 用户名 组名 [root@localhost ~]# id user ...
- (35)zabbix Event acknowledgment事件确认
概述 以往服务器出现报警,运维人员处理完事之后,报警自动取消,但是下一次出现同样一个错误,但是换了一个运维人员,他可能需要重新排查问题,直到问题处理完毕. 针对这种情况,zabbix提供了event ...
- svn设置提交时忽略某些文件
一.在资源管理器中,右键一个未加入版本控制文件或目录,并从弹出菜单选择TortoiseSVN →Add to Ignore List,会出现一个子菜单,允许你仅选择该文件或者所有具有相同后缀的文件. ...
- perl学习之:read
perl read()函数例子,read()函数实例代码 - 读取,或试图读取,长度LENGTH 与文件句柄FILEHANDLE 相关联的文件到缓冲区BUFFER中的字节数. 语法 read FILE ...
- Python中单元测试出错了,会怎么样?
在上一篇中,我们看到了单元测试正常通过时的情况,如果我们边修改一下要测试的函数,然后再运行单元测试,会出现什么情况. 原say_hello_name.py def hello_name(name): ...
- Java面试——从JVM角度比较equals和==的区别
1. Java中数据类型分类 1.1 基本数据类型 又称为原始数据类型,byte,short,char,int,long,float,double,boolean,他们之间的比较应该使用(== ...
- IIS PUT
测试版本:IIS6.0 利用工具 1.IIS PUT Scaner By ZwelL 2.桂林老兵IIS写权限利用程序 -------------------------------------- ...
- scp命令(基于ssh上传文件等)
(转:http://www.cnblogs.com/hitwtx/archive/2011/11/16/2251254.html) svn 删除所有的 .svn文件 find . -name .svn ...
- 【BZOJ3991】寻宝游戏(虚树,DFS序,splay)
题意:求在树中从任意点开始,经过若干个关键点回到原点的最小距离 要求支持在线将某个点设置(取消)为关键点,以及询问答案 n,m<=100000 len[i]<=10^9 思路:显然是一个虚 ...
- Unslider--入门篇
Unslider--入门篇 背景:因工作需求,需要完成一个图片轮播效果,因博主不是专业的前端开发人员,so google之,经过挑选最终选择使用Unslider插件完成工作. 一.Unslider插件 ...