3.2 View的滑動

1. 實現(xiàn)滑動的三種方式

  • 通過View本身提供的scrollTo/scrollBy方法
  • 通過動畫給View施加平移效果
  • 通過改變View的LayoutParams使得View重新布局,實現(xiàn)滑動

2. scrollTo/scrollBy

使用:

view.scrollTo(200,200);
view.scrollBy(200,200);

源碼:

public void scrollTo(int x, int y) {
    if (mScrollX != x || mScrollY != y) {
        int oldX = mScrollX;
        int oldY = mScrollY;
        mScrollX = x;
        mScrollY = y;
        invalidateParentCaches();
        onScrollChanged(mScrollX, mScrollY, oldX, oldY);
        if (!awakenScrollBars()) {
            postInvalidateOnAnimation();
        }
    }
}

public void scrollBy(int x, int y) {
    scrollTo(mScrollX + x, mScrollY + y);
}

scrollBy實際上是調(diào)用了scrollTo方法,他實現(xiàn)的是相對滑動;而scrollTo實現(xiàn)的是絕對滑動。
在滑動過程中,mScrollX的值總是等于View的左邊緣和View的內(nèi)容的左邊緣在水平方向的距離,而mScrollY的值等于View上邊緣和View內(nèi)容的上邊緣的豎直距離。
View的邊緣指View的位置。內(nèi)容邊緣指View中的內(nèi)容的邊緣。scrollTo/scrollBy只能改變View的內(nèi)容邊緣,而不能改變View在布局中的位置。mScrollX和mScrollY的單位是像素,是有正負(fù)的。起始位置-終點位置的結(jié)果值就是scrollX和scrollY的值,是正就是正,是負(fù)就是負(fù)。也就是當(dāng)View左邊緣在View內(nèi)容左邊緣的右邊時,mScrollX為正。反之為負(fù)。

3. 使用動畫

objectAnimator = ObjectAnimator.ofFloat(view,"translationX",0,500).setDuration(5000);
objectAnimator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        Log.e("aaa", "x=" + view.getX() + ",y=" + view.getY() + ",translationX=" + view.getTranslationX() + ",translationY=" + view.getTranslationY());
    }

    @Override
    public void onAnimationCancel(Animator animation) {

    }

    @Override
    public void onAnimationRepeat(Animator animation) {

    }
});
view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.e("aaa", "x=" + view.getX() + ",y=" + view.getY() + ",translationX=" + view.getTranslationX() + ",translationY=" + view.getTranslationY());
        objectAnimator.start();
    }
});

動畫啟動前打印x,translationX的值,動畫結(jié)束后,也打印他們的值如下:

x=30.0,y=30.0,translationX=0.0,translationY=0.0 
x=530.0,y=30.0,translationX=500.0,translationY=0.0

前文說過

x=left + translationX

3.0以上的屬性動畫其位置是隨著動畫移動了的,而3.0以下的機(jī)器由于不支持屬性動畫,所以位置不隨著動畫移動,這是動畫的主要缺點。

4. 改變布局參數(shù)

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();
lp.width+=100;
lp.leftMargin+=100;
view.requestLayout();
// 或者 view.setLayoutParams(lp);

5. 三種方式的比較

  • scrollTo/scrollBy:操作簡單,適合對View內(nèi)容的滑動
  • 動畫:操作簡單,主要用于沒有交互的View或者復(fù)雜動畫。
  • 改變參數(shù)布局:操作稍微復(fù)雜,適用于有交互的Veiw

6. 小栗子

public class DemoButton extends Button {
    int mLastX, mLastY;

    public DemoButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getRawX();
        int y = (int) event.getRawY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE:
                int deltaX = x - mLastX;
                int deltaY = y - mLastY;
                int translationX = (int) getTranslationX() + deltaX;
                int translationY = (int) getTranslationY() + deltaY;
                setTranslationX(translationX);
                setTranslationY(translationY);
                break;
        }
        mLastX = x;
        mLastY = y;
        return true;
    }
}

這個例子其實不用動畫,因為move的響應(yīng)非???,已經(jīng)達(dá)到了動畫要求的梯度值,所以直接設(shè)置其值就可以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是View View 是 Android 中所有控件的基類。 View的位置參數(shù) View 的位置由它的四個頂...
    acc8226閱讀 1,378評論 0 7
  • 目前移動設(shè)備流行,我們要在如此小的屏幕上盡可能給用戶展現(xiàn)更多的內(nèi)容,就需要在應(yīng)用上通過滑動來顯示和隱藏部分內(nèi)容,V...
    shenhuniurou閱讀 1,013評論 2 1
  • 開發(fā)中,為了增加更多炫麗的效果,我們經(jīng)常在應(yīng)用中添加滑動效果,今天就來分析一下 View 中滑動效果的實現(xiàn)原理以及...
    任教主來也閱讀 3,162評論 0 14
  • 第3章 View的事件體系 [TOC] 3.1 View基礎(chǔ)知識 1. View的位置參數(shù) 首先來認(rèn)識一下View...
    反復(fù)橫跳的龍?zhí)?/span>閱讀 1,132評論 0 5
  • 文/顧與歸 夏日的陽光舞著 你似一束耀眼的火光 肆意濺落 我不敢前往,怕驚擾了你 又不舍挪腳離開,盼你回頭 暢想著...
    顧與歸閱讀 270評論 2 0

友情鏈接更多精彩內(nèi)容