参考:
Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller类详解
http://blog.csdn.net/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 ~