Android 滑动界面实现---Scroller类别 从源代码和开发文档了解(让你的移动布局)
。以下要讲的不是这个库,而是这个库的实现过程中使用到的---Scroller类。懂了之后你看库的源代码就知道,原来它是这样实现的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmlwemp5bm8x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
android发开文档
Scroller
一.结构关系
二.概述
Class Overview
This class encapsulates scrolling. You can use scrollers (Scroller or OverScroller)
to collect the data you need to produce a scrolling animation—for example, in response to a fling gesture. Scrollers track scroll offsets for you over time, but they don't automatically apply those positions to your view. It's your responsibility to get and
apply new coordinates at a rate that will make the scrolling animation look smooth.
To track the changing positions of the x/y coordinates, use computeScrollOffset().
The method returns a boolean to indicate whether the scroller is finished. If it isn't, it means that a fling or programmatic pan operation is still in progress. You can use this method to find the current offsets of the x and y coordinates, for example:
跟踪变化的x / y坐标的位置,通过computeScrollOffset()方法监听返回的布尔值来指示滚动动作是否完毕。假设返回为false,说明滚动已经结束。返回true,它意味着操作仍在进行中。您能够使用
int currX = mScroller.getCurrX(); //滚动的X滚动距离
int currY = mScroller.getCurrY();
//滚动的y滚动距离
这种方法来找到当前的x和y坐标的偏移量。
三.构造函数
| Public Constructors | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Create a Scroller with the default duration and interpolator.
|
||||||||||
|
|
Create a Scroller with the specified interpolator.
|
||||||||||
|
|
Create a Scroller with the specified interpolator.
|
||||||||||
Interpolator interpolator 表示的是动画插入器,你能够设定对应的效果给它。
Interpolator
implements TimeInterpolator
|
android.view.animation.Interpolator |
AccelerateDecelerateInterpolator
动画效果:開始和结束都是缓慢的。通过中间时候加速
AccelerateInterpolator,
动画效果:開始缓慢。之后加速
AnticipateInterpolator,
动画效果:開始后退,然后前进
AnticipateOvershootInterpolator,
动画效果:開始后退,之后前进并超过终点位置,终于退回到终点
BounceInterpolator,
动画效果:慢慢反弹到,弹性衰减到结束
CycleInterpolator,
动画效果:反复循环动画,速度变化遵循正弦定律
DecelerateInterpolator,
动画效果:刚開始高速。之后减速
LinearInterpolator,
动画效果:不断的变化
OvershootInterpolator
动画效果:像前超越终于点然后回来
能够通过初始化构造方法Scroller(Context context, Interpolator interpolator)给它对应的动画效果。
Interpolator interpolator = new BounceInterpolator();
四.公共方法
| Public Methods | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
void
|
abortAnimation() 停止动画,滚到终于的x,y位置中止动画
|
||||||||||
|
boolean
|
computeScrollOffset()
当你想要知道新的位置时候。调用该方法。返回true:动画没结束 |
||||||||||
|
void
|
extendDuration(int
extend) 延长滚动动画的时间。extend表示延迟时间(单位为毫秒) |
||||||||||
|
void
|
fling(int
startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) 在fling(高速滑动,触摸屏幕后快意移动松开)的手势基础上開始滚动,滚动距离取决于fling的初速度。
|
||||||||||
|
final void
|
forceFinished(boolean
finished) 强制终止滚动。 |
||||||||||
|
float
|
getCurrVelocity()
返回当前的速度 |
||||||||||
|
final int
|
getCurrX() 返回当前滚动的X方向的偏移量(距离原点X轴方向)
|
||||||||||
|
final int
|
getCurrY() 返回当前滚动的Y方向的偏移量(距离原点Y轴方向)
|
||||||||||
|
final int
|
getDuration() 返回滚动事件的持续时间(毫秒)
|
||||||||||
|
final int
|
getFinalX() 返回滚动结束的X方向的偏移量(注:仅仅针对fling
手势有效)(距离原点X轴方向) |
||||||||||
|
final int
|
getFinalY()
返回滚动结束的Y方向的偏移量(注:仅仅针对fling 手势有效)(距离原点Y轴方向) |
||||||||||
|
final int
|
getStartX() 返回滚动起始点的X方向偏移量(距离原点X轴方向)
|
||||||||||
|
final int
|
getStartY() 返回滚动起始点的Y方向偏移量.(距离原点Y轴方向)
|
||||||||||
|
final boolean
|
isFinished() 返回scroller滚动是否结束,true:滚动结束
false:还在滚动 |
||||||||||
|
void
|
setFinalX(int newX) 设置scroller的终止时X方向偏移量
|
||||||||||
|
void
|
setFinalY(int newY) 设置scroller的终止时Y方向偏移量
|
||||||||||
|
final void
|
setFriction(float friction)
The amount of friction applied to flings.
|
||||||||||
|
void
|
startScroll(int
startX, int startY, int dx, int dy) 提供起始点和滚动距离,调用该方法进行滚动。(此处默认时间为250ms)
|
||||||||||
|
void
|
startScroll(int
startX, int startY, int dx, int dy, int duration) 提供起始点和滚动距离以及滚动时间,调用该方法进行滚动。
|
||||||||||
|
int
|
timePassed() 返回自滚动開始经过的时间(毫秒)
|
||||||||||
源代码
以下看看以上方法的源代码实现:
知识点1:computeScrollOffset()方法
/**
* Call this when you want to know the new location. If it returns true,
* the animation is not yet finished. loc will be altered to provide the
* new location.
*/
public boolean computeScrollOffset() {
if (mFinished) {
return false; //已经完毕了本次动画。直接返回为false
}
int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime); if (timePassed < mDuration) {
switch (mMode) {
case SCROLL_MODE:
float x = timePassed * mDurationReciprocal; if (mInterpolator == null)
x = viscousFluid(x);
else
x = mInterpolator.getInterpolation(x); mCurrX = mStartX + Math.round(x * mDeltaX);
mCurrY = mStartY + Math.round(x * mDeltaY);
break;
case FLING_MODE:
final float t = (float) timePassed / mDuration;
final int index = (int) (NB_SAMPLES * t);
float distanceCoef = 1.f;
float velocityCoef = 0.f;
if (index < NB_SAMPLES) {
final float t_inf = (float) index / NB_SAMPLES;
final float t_sup = (float) (index + 1) / NB_SAMPLES;
final float d_inf = SPLINE_POSITION[index];
final float d_sup = SPLINE_POSITION[index + 1];
velocityCoef = (d_sup - d_inf) / (t_sup - t_inf);
distanceCoef = d_inf + (t - t_inf) * velocityCoef;
}
mCurrVelocity = velocityCoef * mDistance / mDuration * 1000.0f; mCurrX = mStartX + Math.round(distanceCoef * (mFinalX - mStartX));
// Pin to mMinX <= mCurrX <= mMaxX
mCurrX = Math.min(mCurrX, mMaxX);
mCurrX = Math.max(mCurrX, mMinX); mCurrY = mStartY + Math.round(distanceCoef * (mFinalY - mStartY));
// Pin to mMinY <= mCurrY <= mMaxY
mCurrY = Math.min(mCurrY, mMaxY);
mCurrY = Math.max(mCurrY, mMinY);
if (mCurrX == mFinalX && mCurrY == mFinalY) {
mFinished = true;
}
break;
}
}
else {
mCurrX = mFinalX;
mCurrY = mFinalY;
mFinished = true;
}
return true;
}
调用该方法推断滚动是否还在继续。mFinished属性推断是否滚动完毕,假设滚动完毕了,mFinished
= true,computeScrollOffset() 返回false。
知识点2:computeScroll()方法
/**
* Called by a parent to request that a child update its values for mScrollX
* and mScrollY if necessary. This will typically be done if the child is
* animating a scroll using a {@link android.widget.Scroller Scroller}
* object.
*/由父视图调用用来请求子视图依据偏移值 mScrollX,mScrollY又一次绘制
public void computeScroll() {
}
知道了computeScrollOffset()这个推断是否滚动的方法,那我们必需要有监听滑屏控制,而且重绘,在Android框架中的VIEW类中就提供了computeScroll()这种方法去控制该流程。在绘制View时,会在draw()过程调用该方法。
因此。 再配合使用Scroller实例。我们就能够获得当前应该的偏移坐标,手动使View/ViewGroup偏移至该处。
注:在使用Scroller这个类实现偏移控制,一般自己定义View/ViewGroup都须要重载该方法
。
详细实现:
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
// 更新界面
postInvalidate();
isMoving = true;
} else {
isMoving = false;
}
super.computeScroll();
}
知识点3:startScroll()方法
/**
* Start scrolling by providing a starting point and the distance to travel.
*
* @param startX //水平方向滚动的偏移值,以像素为单位。正值表明滚动将向左滚动
* @param startY //垂直方向滚动的偏移值。以像素为单位。正值表明滚动将向上滚动
* @param dx //水平方向滑动的距离,正值会使滚动向左滚动
* @param dy //垂直方向滑动的距离。正值会使滚动向上滚动
* @param duration //滚动持续时间
*/
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;
}
该方法以提供的起始点和将要滑动的距离開始滚动。我们能够使用该方法达到自己主动滚动的效果。在滚动中,假设符合什么条件。能够调用该方法让它滚动到相相应的地方。
着重点:
在界面滚动中,你必须搞清楚和scrollTo和scrollBy之间的差别所在:android
布局之滑动探究 scrollTo 和 scrollBy 方法使用说明
使用思路流程:
假设你使用Scroller。流程例如以下:
1.能够在自己定义的布局中,依照需求初始化Scroller构造函数。
2.重写onInterceptTouchEvent(MotionEvent ev)方法。看看是否要拦截相关的点击时间。
3.重写onTouchEvent(MotionEvent event)方法,依据触摸屏上的动作使用computeScroll()以及scrollTo
和 scrollBy方法进行依据手指对布局进行滑动效果。
4.在触摸操作结束(MotionEvent.ACTION_UP)的时候。调用startScroll(int startX, int startY, int dx, int dy, int duration)方法。进行动画自己主动操作。来完毕整个滚动流程。
对于Scroller类大体的使用和介绍已经完成。之后会放上自己调用类实现的几个美丽的效果。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
Android 滑动界面实现---Scroller类别 从源代码和开发文档了解(让你的移动布局)的更多相关文章
- ASP.NET综合管理ERP系统100%源代码+所有开发文档
该系统开发环境为:VS2010,数据库採用SQL Server,框架为ASP.NET. 源代码包含所有文档说明,代码简单易懂,凝视完整. 提示:假设没有安装水晶报表系统执行会报错,报表安装程序已经打包 ...
- Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)
在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.. 例子相关博文:Androi ...
- [翻译]开发文档:android Bitmap的高效使用
内容概述 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently",包括大尺寸Bitmap的高效加载,图片的异步加载和数据缓存 ...
- Android官方开发文档Training系列课程中文版:目录
Android官方开发文档Training系列课程中文版:目录 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻译成英文,供国内的开发者使用,尤其是入门开 ...
- 在线API,桌面版,jquery,css,Android中文开发文档,JScript,SQL掌用实例
学习帮助文档大全 jquery,css,Android中文开发文档,JScript,SQL掌用实例 http://api.jq-school.com/
- Android官方开发文档下载
Android官方开发文档 docs-24_r02.rar(链接:https://pan.baidu.com/s/12xC998JeUHj3ndfDXPM2ww 密码:bxyk) ADT下载.Andr ...
- Android App签名打包 与 SDK开发文档
Android App签名打包签名的意义1.为了保证每个程序开发者的合法权益2.放置部分人通过使用相同的Package Name来混淆替换已经安装的程序,从而出现一些恶意篡改3.保证我们每次发布的版本 ...
- android开发文档工具集(持续更新中...)
http://www.androiddevtools.cn/ android 产品->交互->视觉->开发->测试各种工具地址下载, 各种文档下载应有尽有,强烈推荐. ht ...
- Android基础开发文档汇总
一.Android 基本组件 1. Android中PackageManager使用示例 : http://blog.csdn.net/qinjuning/article/details/68678 ...
随机推荐
- [Windwos Phone 8]多个按钮的共用事件
原文:[Windwos Phone 8]多个按钮的共用事件 前言 ------------------------------------------------------------------- ...
- 如何使用ZEROBRANE STUDIO远程调试COCOS2D-X的LUA脚本(转)
http://www.cocos2d-x.org/docs/manual/framework/native/v2/lua/lua-remote-debug-via-zerobrane/zh ZeroB ...
- 【原创】leetCodeOj --- Fraction to Recurring Decimal 解题报告
原题地址: https://oj.leetcode.com/problems/fraction-to-recurring-decimal/ 题目内容: Given two integers repre ...
- 在 VS 类库项目中 Add Service References 和 Add Web References 的区别
原文:在 VS 类库项目中 Add Service References 和 Add Web References 的区别 出身问题: 1.在vs2005时代,Add Web Reference(添加 ...
- 源代码版本控制工具TortoiseSVN,AnkhSVN最新版本下载地址
TortoiseSVN http://tortoisesvn.net/downloads.html 页面下部有中文语言补丁 AnkhSVN https://ankhsvn.open.collab.ne ...
- 任意长度的正小数的加法(YT新人之巅峰大决战05)
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个"小明 ...
- 【C语言探索之旅】 第一部分第十课:练习题+习作
内容简介 1.课程大纲 2.第一部分第十课: 练习题+习作 3.第二部分第一课预告: 模块化编程 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三 ...
- FastReport的再次使用
FastReport.Net是一款功能齐全的报表分析解决方案. 前两年工作的时候就是使用FastReport进行报表设计,只是当时使用的时候都是调用别人写好的帮助类,直接调用即可.当时让人觉得不明觉厉 ...
- c语言实现hashtable,相似C++的map和iOS的NSDictionary
跟线性数组和链表不同.HashTable是高速查找的数据结构.本文中的HashTable使用链表处理数组. 该HashTable能够指定table的长度.提供了遍历的方法. 包含table的长度的选择 ...
- ASP.NET 异步编程
ASP.NET 异步编程 相关博文: 异步编程 In .NET(回味无穷!!!) ASP.NET sync over async(异步中同步,什么鬼?) 本来这篇博文想探讨下异步中的异常操作,但自己在 ...
Known