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; //布局的宽高大小
    }


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

 

 

使用:

 

    <com.ppdai.mvpstudy.views.DragView
        android:layout_width="50dp"
        android:layout_height="50dp" />

我是源码

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值