Android實現View滑動的五種方法

PS:本文不講解動畫實現view的滑動,主要講通過onTouchEvent進行滑動。

1.採用View.setX,setY進行重新佈局

 tv.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        startX=event.getX();
                        startY=event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        tv.setX(event.getRawX()-startX);
                        tv.setY(event.getRawY()-startY);
                        break;
                }
                return true;
            }
        });

2.採用View.layout()進行重新佈局

        tv.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        startX=event.getX();
                        startY=event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int offSetX= (int) (event.getX()-startX);
                        int offSetY= (int) (event.getY()-startY);
                        tv.layout(tv.getLeft()+offSetX,tv.getTop()+offSetY,tv.getRight()+offSetX,tv.getBottom()+offSetY);
                        break;
                }
                return true;
            }
        });

3.採用View.offsetLeftAndRight(),offsetTopAndBottom進行重新佈局,參數爲偏移量–跟layout()較相似

tv.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        startX=event.getX();
                        startY=event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int offSetX= (int) (event.getX()-startX);
                        int offSetY= (int) (event.getY()-startY);
                        //同時對left和right進行偏移
                        tv.offsetLeftAndRight(offSetX);
                        //同時對top和bottom進行偏移
                        tv.offsetTopAndBottom(offSetY);
                        break;
                }
                return true;
            }
        });

4.通過設置LayoutParams的margin數值達到滑動

 tv.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        startX=event.getX();
                        startY=event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int offSetX= (int) (event.getX()-startX);
                        int offSetY= (int) (event.getY()-startY);
                        CoordinatorLayout.LayoutParams params= (CoordinatorLayout.LayoutParams) tv.getLayoutParams();
                        params.leftMargin=tv.getLeft()+offSetX;
                        params.topMargin=tv.getTop()+offSetY;
                        tv.setLayoutParams(params);
                        break;
                }
                return true;
            }
        });

5.通過scrollBy或scrollTo

tv.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        startX=event.getX();
                        startY=event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int offSetX= (int) (event.getX()-startX);
                        int offSetY= (int) (event.getY()-startY);
                        /**
                         * scrollBy表示移動的增量,scrollTo表示移動到哪個座標
                         * textview的scrollBy移動的是textview的content文本,而viewgroup的scrollBy移動的是內部所有子view,scrollTo同理
                         * scrollBy內的移動增量offSetX,offSetX若爲正,則content將向相反的方向移動,反之也是。
                         */
                        ((ViewGroup)tv.getParent()).scrollBy(-offSetX,-offSetY);
                        break;
                }
                return true;
            }
        });

效果圖(採用的方法五):
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章