Android群英傳讀書筆記--第5章 Android Scroll分析

個人讀書筆記,部分沒讀懂的知識點可能會簡單概括或缺失,以后反復閱讀后再完善。

第5章 Android Scroll分析

5.1 滑動效果是如何產(chǎn)生的

5.1.1 Android 坐標系

系統(tǒng)提供了
getLocationOnScreen(intlocation[])
這樣的方法獲取Android坐標系中點的位置。

在觸控事件中使用
getRaw()、getRawY()
方法獲得Android 坐標系的坐標。

5.1.2 視圖坐標系

試圖坐標系描述了子試圖在父試圖中的位置關(guān)系。

在視圖坐標系中,原點不再是Android坐標系中的屏幕最左上角,而是以父試圖坐上角為坐標系原點。

在觸控事件中使用
getX()、getY()
獲取視圖坐標系中的坐標。

坐標系.jpg

5.1.3 觸控事件--MotionEvent

在onTouchEvent(MotionEvent event)方法中通過event.getAction()來獲取觸控事件的類型。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        //獲取當前輸入點的X、Y坐標(視圖坐標)
        int x=(int)event.getX();
        int y=(int)event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
        }
        return true;
    }

5.2 實現(xiàn)滑動的七種方法

5.2.1 layout方法

@Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        int rawX = (int) (event.getRawX());
        int rawY = (int) (event.getRawY());
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = x;
                lastY = y;
                //lastX=rawX;
                //lastY=rawY;
                break;
            case MotionEvent.ACTION_MOVE:
                int offsetX = x - lastX;
                int offsetY = y - lastY;

                //int offsetX = rawX - lastX;
                //int offsetY = rawY - lastY;
                layout(getLeft() + offsetX,
                        getTop() + offsetY,
                        getRight() + offsetX,
                        getBottom() + offsetY);
                /*
                * 使用絕對坐標系要記得重新設(shè)置初始坐標
                * */
                //lastX=rawX;
                //lastY=rawY;
                break;

        }
        return true;
    }

5.2.2 offsetLeftAndRight()與offsetTopAndBottom()

就算出偏移量后,使用如下代碼。

//同時對left和right進行偏移
offsetLeftAndRight(offsetX);
//同時對top和bottom進行偏移
offsetTopAndBottom(offsetY);

5.2.3 LayoutParams

//動態(tài)修改布局的位置參數(shù)
LinearLayout.LayoutParams layoutParams=
 (LinearLayout.LayoutParams) getLayoutParams();
layoutParams.leftMargin=getLeft()+offsetX;
layoutParams.topMargin=getTop()+offsetY;
setLayoutParams(layoutParams);

也可以使用ViewGroup.MarginLayoutParams

//ViewGroup.MarginLayoutParams就不用考慮父布局的類型
ViewGroup.MarginLayoutParams layoutParams1=
 (ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.leftMargin=getLeft()+offsetX;
layoutParams.topMargin=getTop()+offsetY;
setLayoutParams(layoutParams);

5.2.4 scrollTo與scrollBy

因為scrollBy方法移動的是View的content,所以應該就View所在的ViewGroup中來使用scrollBy方法。

而設(shè)置scrollBy時存在參考系選擇的問題,所以需要給偏移量加上負號。

((View)getParent()).scrollBy(-offsetX,-offsetY);

5.2.5 Scroller

通過Scroller類可以實現(xiàn)平滑移動的效果,scrollBy是瞬間移動。

            case MotionEvent.ACTION_UP:
                View viewGroup = ((View) getParent());
                mScroller.startScroll(
                        viewGroup.getScrollX(),
                        viewGroup.getScrollY(),
                        -viewGroup.getScrollX(),
                        -viewGroup.getScrollY()
                );
                invalidate();
                break;

5.2.6 屬性動畫

第7章中講。

5.2.7 ViewDragHelper

ViewDragHelper基本可以實現(xiàn)各種不同的滑動、拖放需求。

演示了一個QQ滑動側(cè)邊欄的布局案例。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,862評論 2 59
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評論 25 708
  • Android 群英傳筆記第一章Android體系與系統(tǒng)架構(gòu)第二章 Android開發(fā)工具及技巧第三章 Andro...
    YoungerDev閱讀 472評論 0 5
  • 導語 滑動算是Android比較常用的效果了,滑動的操作具有很好的用戶體驗性。 主要內(nèi)容 滑動效果是如何產(chǎn)生的 實...
    一個有故事的程序員閱讀 6,479評論 3 11
  • 內(nèi)擺線:一個圓的定點在沿著另一個圓內(nèi)邊滾動時,該點形成的曲線叫內(nèi)擺線。 其實是非常酷炫的一件事。 2.外擺線 ht...
    Alaska閱讀 867評論 0 0