[android]Scroller 的一些思考

参考:

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 ~

猜你喜欢

转载自poolo.iteye.com/blog/1707511
今日推荐