• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

明白Scroller

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/1014/678.html

 
任何一个控件都是能够转动的,由于在View类中间有scrollTo()和scrollBy()这两个技巧,但应用常州网站开发培训这两个技巧完成的转动结果是跨越式的,没有任何平滑转动的结果.而Scroller恰是完成平滑转动的利器
 
 
 
Android Scroller彻底分析
 
 
 
View滑动的若干技巧
 
 
 
startScroll技巧
 
 
 
对于Scroller的startScroll 技巧一直不太明白
 
 
 
startScroll
 
 
 
added in API level 9
 
public void startScroll (int startX, 
 
                int startY, 
 
                int dx, 
 
                int dy)
 
Start scrolling by providing a starting point and the distance to travel. The scroll will use the default value of 250 milliseconds for the duration.
 
 
 
Parameters
 
startX int: Starting horizontal scroll offset in pixels. Positive numbers will scroll the content to the left.
 
startY int: Starting vertical scroll offset in pixels. Positive numbers will scroll the content up.
 
dx int: Horizontal distance to travel. Positive numbers will scroll the content to the left.
 
dy int: Vertical distance to travel. Positive numbers will scroll the content up.
 
例子: 点击Button完成平滑转动
 
 
 
public class ScrollerButton extends Button {
 
    private OverScroller mScroller;
 
 
 
    public ScrollerButton(Context context, AttributeSet attrs) {
 
        super(context, attrs);
 
        mScroller = new OverScroller(context);
 
    }
 
 
 
    @Override
 
    public void computeScroll() {
 
        super.computeScroll();
 
        if (mScroller.computeScrollOffset()) {
 
            ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
 
            invalidate();
 
        }
 
    }
 
 
 
    public void smoothScrollTo(int destX, int destY) {
 
        int scrollX = getScrollX();
 
        int delta = destX - scrollX;
 
        mScroller.startScroll(scrollX, 0, delta, 0, 2000);
 
        invalidate();
 
    }
 
}
 
 
 
----
 
挪用片面:
 
scrollToBtn.setOnClickListener(new View.OnClickListener() {
 
    @Override
 
    public void onClick(View v) {
 
        layout.scrollTo(-60, 0);
 
    }
 
});
 
 
 
smoothScrollToBtn.setOnClickListener(new View.OnClickListener() {
 
    @Override
 
    public void onClick(View v) {
 
        smoothScrollToBtn.smoothScrollTo(-60, 0);
 
    }
 
});
 
由于转动都是针对内容,要想完成Button整体挪动, computeScroll中要挪用其父控件的scrollTo技巧
 
 
 
对照常州软件技术培训新鲜是,第一次点击, Butoon两秒后向右挪动到60地位
 
再次点击,又重复这个动作,先向左回到0,再向右回到 60 -> 0 -> 60
 
为何会如许呢, 本来是getScrollX()在捣鬼, Button永远没有实行过ScroolTo和ScroolBy技巧, 以是getScrollX永远为0. 以是一直重复 0 到 -60
 
 
 
论startScroll的精确用法
 
 
 
 public void smoothScrollTo(int destX, int destY) {
 
        int scrollX = ((View) getParent()).getScrollX();
 
        Log.i(TAG, "smoothScrollTo: " + scrollX);
 
        mScroller.startScroll(scrollX, 0, destX - scrollX, 0, 2000);
 
        invalidate();
 
    }
 
第一个参数的要写getScrollX(), 避免上头的新鲜现象
 
第三个参数要减去scrollX, 如许能够包管滑到指定地位就不滑了, 否则回出现永远滑动的问题.
 
  void startScroll(int start, int distance, int duration) {
 
            mFinished = false;
 
 
 
            mCurrentPosition = mStart = start;
 
            mFinal = start + distance;
 
 
 
            mStartTime = AnimationUtils.currentAnimationTimeMillis();
 
            mDuration = duration;
 
 
 
            // Unused
 
            mDeceleration = 0.0f;
 
            mVelocity = 0;
 
        }
 
 

上篇:上一篇:Android之 Fragment 的使用
下篇:下一篇:C/C++ 用MySql数据库的技巧