安卓系统谁开发的|安卓开发之Scroller.startScroll()方法简介

更新时间:2020-10-18    来源:安卓教程    手机版     字体:

【www.bbyears.com--安卓教程】

上篇说到,可以使用scrollBy和scrollTo移动View,这里产生一个问题,加入一个View在屏幕的左上角即(0,0)位置,他调用

scrollTo(-300,-300)时,会立即跳过去,显得很突兀,如何让他平缓地划过去呢?就可以用本篇的方法了。


使用方法:

int startX;//滑动动作的起始点x坐标
int startY;//滑动动作的起始点y坐标
int dx;    //x轴偏移量向左为负,向右为正(即负值向右移,正值向左移)
int dy;    //y轴偏移量向左为负,向右为正(即负值向右移,正值向左移)
int duration;//时间,默认为250ms
注意:这里的dx和dy和上篇的scrollBy的参数相似,都是往哪个地方移动了多少,而不是往哪个点移动
Scroller mScroller=new Scroller(context);
mScroller.startScroll(startX,startY,dx,dy);
invalidate();//

除了上面的代码之外,还得重写View的computeScroll方法:

这里我的理解是:判断某一阶段滑动完成,就调用scrollTo方法,实现真正的移动

@Override
public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
        postInvalidate();
    }
    super.computeScroll();
}

可能大家还有点不明白,我还是来画图吧:

一个view,距离上边300px,距离左边300px,即他的坐标为(300,300);

那么这个时候,我们希望他从当前的这个位置,缓慢移动到(0,0),用时1秒,就这么写:

mScroller.startScroll(-300, -300, 300, 300,1000);

假设我们希望它从(300,300)移动到(100,100):

mScroller.startScroll(-300, -300, 200, 200,5000);

假设我们希望它从(300,300)移动到(200,200):

mScroller.startScroll(-300, -300, 100, 100,5000);

这样只是移动某段距离,那我们怎么样使它移动到一个固定的点呢?

我们可以这样做:假设我们想要移动到(100,100):


mScroller.startScroll(-300, -300, 0, 0, 500);
mScroller.setFinalX(100);
mScroller.setFinalY(100);
invalidate();

我为什么这样写呢?是有依据的,看一下startScroll的源码:

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;
}
 

其中:

mFinalX = startX + dx;
mFinalY = startY + dy;

就是把我们传进去的几个值加了一下,意思就是,我们传的dx,dy,就是我们移动的偏移量,受到起始数值的约束,

所以我们单独操控mFinalX、mFinalY就可以了.

最后解释一下computeScroll方法:


@Override
public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
        postInvalidate();
    }
    super.computeScroll();
}

首先把上面的例子拿来:

mScroller.startScroll(-300, -300, 300, 300,1000);
在(300,300)点,用时一秒,移动到(0,0),我们想一下,在一秒内完成这个操作,假设我们细分成100部分,即一部分为10ms,

那么在第一个10ms,    mScrollerd的getCurrX()就是-300+3=-270,getCurrX同理,即第一个10ms后,view需要向左边移动了3px,这个时候computeScroll调用了,我们先判断一下mScroller的第一个阶段是不是完成了,假设完成了,就调用scrollTo()方法。

这样经过100个部分,在我们看来,就是缓慢的移动过去了.

本文来源:http://www.bbyears.com/shoujikaifa/105329.html

热门标签

更多>>

本类排行