Android 实现view随意拖动

需求

项目中使用到了视频直播,需要悬浮一个200*200的view在界面上,并且需要可拖动。

思路

  • 使用帧布局来悬浮view;
  • OnTouch来拖动改变view的位置;

实现

mRlayout 为父布局

private int lastX, lastY;
liveView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        lastX = (int) event.getRawX();
                        lastY = (int) event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int dx = (int) event.getRawX() - lastX;
                        int dy = (int) event.getRawY() - lastY;

                        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) v.getLayoutParams();

                        int l =layoutParams.leftMargin + dx;
                        int t = layoutParams.topMargin + dy;
                        int b =mRlayout.getHeight()- t-v.getHeight();
                        int r =mRlayout.getWidth()- l-v.getWidth();
                        if (l < 0) {//处理按钮被移动到上下左右四个边缘时的情况,决定着按钮不会被移动到屏幕外边去
                            l = 0;
                            r =mRlayout.getWidth()-v.getWidth();
                        }
                        if (t < 0) {
                            t = 0;
                            b = mRlayout.getHeight()-v.getHeight();
                        }

                        if (r<0) {
                            r =0;
                            l = mRlayout.getWidth()-v.getWidth();
                        }
                        if (b<0) {
                            b = 0;
                            t = mRlayout.getHeight()-v.getHeight();
                        }
                        layoutParams.leftMargin = l;
                        layoutParams.topMargin = t;
                        layoutParams.bottomMargin = b;
                        layoutParams.rightMargin = r;
                        v.setLayoutParams(layoutParams);

                        lastX = (int) event.getRawX();
                        lastY = (int) event.getRawY();
                        v.postInvalidate();
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }
                return true;
            }
        });

注意

这里是在view移动时通过setLayoutParams改变view位置,是为了避免更改页面的其它view时导致该view复位,因为更改页面view时会触发父布局重绘,使用layout时父布局并不知道子view的位置比发生了改变,这样就会使view复位。但是使用setLayoutParams时,父布局知道子布局发生了改变,就解决了子布局复位的问题。

你可能感兴趣的:(Android 实现view随意拖动)