参考:
Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller类详解
http://blog.youkuaiyun.com/qinjuning/article/details/7419207
Scroller与scrollby/scrollto的区别
Scroller的构造方法是new Scroller(context ); 他是 在执行startScroll(int x,int y,int dx,int dy,int dt);请求当前context下的view 执行自己的computeScroll()方法 【注:这个方法默认是空方法,需要自己覆写】从而实现移动
public void computeScroll() {
// TODO Auto-generated method stub
Log.e(TAG, "computeScroll");
// 如果返回true,表示动画还没有结束
// 因为前面startScroll,所以只有在startScroll完成时 才会为false
if (mScroller.computeScrollOffset()) {
Log.e(TAG, mScroller.getCurrX() + "======" + mScroller.getCurrY());
// 产生了动画效果,根据当前值 每次滚动一点
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
Log.e(TAG, "### getleft is " + getLeft() + " ### getRight is " + getRight());
//此时同样也需要刷新View ,否则效果可能有误差
postInvalidate();
}
else
Log.i(TAG, "have done the scoller -----");
}
public class Scroller {
private int mStartX; //起始坐标点 , X轴方向
private int mStartY; //起始坐标点 , Y轴方向
private int mCurrX; //当前坐标点 X轴, 即调用startScroll函数后,经过一定时间所达到的值
private int mCurrY; //当前坐标点 Y轴, 即调用startScroll函数后,经过一定时间所达到的值
private float mDeltaX; //应该继续滑动的距离, X轴方向
private float mDeltaY; //应该继续滑动的距离, Y轴方向
private boolean mFinished; //是否已经完成本次滑动操作, 如果完成则为 true
//构造函数
public Scroller(Context context) {
this(context, null);
}
public final boolean isFinished() {
return mFinished;
}
//强制结束本次滑屏操作
public final void forceFinished(boolean finished) {
mFinished = finished;
}
public final int getCurrX() {
return mCurrX;
}
/* 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. */
//根据当前已经消逝的时间计算当前的坐标点,保存在mCurrX和mCurrY值中
public boolean computeScrollOffset() {
if (mFinished) { //已经完成了本次动画控制,直接返回为false
return false;
}
int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime);
if (timePassed < mDuration) {
switch (mMode) {
case SCROLL_MODE:
float x = (float)timePassed * mDurationReciprocal;
...
mCurrX = mStartX + Math.round(x * mDeltaX);
mCurrY = mStartY + Math.round(x * mDeltaY);
break;
...
}
else {
mCurrX = mFinalX;
mCurrY = mFinalY;
mFinished = true;
}
return true;
}
//开始一个动画控制,由(startX , startY)在duration时间内前进(dx,dy)个单位,即到达坐标为(startX+dx , startY+dy)出
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
mFinished = false;
mDuration = duration;
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartX = startX; mStartY = startY;
mFinalX = startX + dx; mFinalY = startY + dy;
mDeltaX = dx; mDeltaY = dy;
...
}
}
而scrollby 与scrollto 是直接 移动
今天看到六哥做的滑动的 发现 一个很少用到但是挺好玩的东西Scroller
简单的描述下
对一个view 覆写他的方法
@Override
public void computeScroll() {
// super.computeScroll();
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}
那么 当它自己或者子view触发到
mScroller.startScroll(0, 0, 0, 0, duration);//全是int 初始x 初始y 位移x 位移y 持续时间
就会调用computeScroll()方法。
【关于startScroll 调用startScroll 并不是一次,是把位移时间切割成很小的时间 然后每次调用computeScroll】
而之所以能达到位移的效果 实际上移动的是 把覆写computeScroll的view移动,从而看起 内部的子view也看起来移动了。
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
//这句代码就是移动this这个view 到mScroller.getCurrX(), mScroller.getCurrY()
//mScroller.getCurrX(), mScroller.getCurrY() 随着持续时间duration 持续改变 直到结束
api:http://developer.android.com/reference/android/widget/Scroller.html
中文api:http://www.cnblogs.com/over140/archive/2010/12/16/1907528.html
4楼:http://www.eoeandroid.com/thread-43927-1-1.html
另外 6哥写的一个左右滑动ralativelayout ~