View视图跟随手指移动

之前 看过跟多App在页面中都有一个浮动的按钮,可以随意的在屏幕中拖动 释放后自动贴在屏幕边缘,这个效果其实很简单 就是onTouchEvent事件,在事件中分别处理Down,move,up事件即可。

先看效果图:

为了防止浮动按钮超出屏幕,还需要和屏幕宽高进行实时比对,以下方法是获取屏幕的宽高:

 

        WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mWidth = wm.getDefaultDisplay().getWidth();
        mHeight = wm.getDefaultDisplay().getHeight();


在复写view的onTouchEvent事件

 

 

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = (int) event.getX();
                lastY = (int) event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mParams = (LinearLayout.LayoutParams) getLayoutParams();

                offsetX = getLeft() + x - lastX;
                offsetY = getTop() + y - lastY;

                if (offsetX <= 0) {
                    offsetX = 0;
                }

                if (offsetX + DensityUtil.dip2px(mContext, getDpValue()) >= mWidth) {
                    offsetX = mWidth - DensityUtil.dip2px(mContext, getDpValue());
                }

                if (offsetY <= 0) {
                    offsetY = 0;
                }

                if (offsetY + DensityUtil.dip2px(mContext, getDpValue() + 25) >= mHeight) { //25是状态栏的高度
                    offsetY = mHeight - DensityUtil.dip2px(mContext, getDpValue() + 25);
                }

                mParams.leftMargin = offsetX;
                mParams.topMargin = offsetY;
                setLayoutParams(mParams);
                break;
            case MotionEvent.ACTION_UP:

                if (offsetX > mWidth / 2) {
                    mParams.leftMargin = mWidth - DensityUtil.dip2px(mContext, getDpValue());
                } else {
                    mParams.leftMargin = 0;
                }
                mParams.topMargin = offsetY;
                setLayoutParams(mParams);
                break;
        }

        return true;

    }

    private int getDpValue() {
        return 50; //布局的宽高大小
    }


以上便是浮动按钮跟随手指滑动的全部逻辑代码

 

 

使用:

 

    

我是源码

 

 

你可能感兴趣的:(Android)