Android自定义可拖动的悬浮布局

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40998254/article/details/81459851

首先上效果图

拖动

这个自定义的View是继承RelativeLayout的,所以在写xml布局的时候直接当成RelativeLayout使用即可。

由于在该类中注释的很清楚,在这里我就不再累赘直接上代码

public class MyDragView extends RelativeLayout {

    private ViewDragHelper mDragger;

    private View mAutoBackView;

    public MyDragView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mDragger = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
            @Override
            public int getViewHorizontalDragRange(View child) {
                 //返回可拖动的子视图的水平运动范围(以像素为单位)的大小。
                 //对于不能垂直移动的视图,此方法应该返回0。
                return getMeasuredWidth() - child.getMeasuredWidth();
            }

            @Override
            public int getViewVerticalDragRange(View child) {
                //返回可拖动的子视图的竖直运动范围(以像素为单位)的大小。
                //对于不能垂直移动的视图,此方法应该返回0。
                return getMeasuredHeight() - child.getMeasuredHeight();
            }

            @Override
            public boolean tryCaptureView(View child, int pointerId) {
                //返回true表view示捕获当前touch到的
                return true;
            }

            @Override
            public int clampViewPositionHorizontal(View child, int left, int dx) {
                if (left > getWidth() - child.getMeasuredWidth()){
                    //超出左侧边界处理
                    left = getWidth() - child.getMeasuredWidth();
                } else if (left < 0) {
                    //超出右侧边界处理
                    left = 0;
                }
                return left;
            }

            @Override
            public int clampViewPositionVertical(View child, int top, int dy) {
                if (top > getHeight() - child.getMeasuredHeight()){
                    //超出下边界处理
                    top = getHeight() - child.getMeasuredHeight();
                } else if (top < 0) {
                    //超出上边界处理
                    top = 0;
                }
                return top;
            }


        });
        mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mDragger.shouldInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        //点击位置坐标
        int downX = (int) event.getX();
        int downY = (int) event.getY();
        //悬浮区域左上角坐标
        int x = (int) mAutoBackView.getX();
        int y = (int) mAutoBackView.getY();
        //悬浮区域宽高
        int width = mAutoBackView.getWidth();
        int height = mAutoBackView.getHeight();

        if ((downX >= x && downY >= y) && (downX <= (x+width) && downY <= (y+height)) ) {
            //点击在悬浮区域内部进行事件拦截,否则不拦截
            try {
                mDragger.processTouchEvent(event);
                return true;
            }catch (IllegalArgumentException e){
                return false;
            }
        } else {
            return false;
        }

    }

    @Override
    public void computeScroll() {
        if (mDragger.continueSettling(true)) {
            invalidate();
        }
    }

    /**
     * onFinishInflate 当View中所有的子控件均被映射成xml后触发
     */
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mAutoBackView = getChildAt(0);
    }
    
}

猜你喜欢

转载自blog.csdn.net/weixin_40998254/article/details/81459851