Android 实现view随意拖动

作者: YuGoal | 来源:发表于2017-11-23 15:04 被阅读685次

    需求

    项目中使用到了视频直播,需要悬浮一个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随意拖动

        本文链接:https://www.haomeiwen.com/subject/puyzvxtx.html