使控件可拖拽

/**
     * 监听控件移动状态
     * @param view 控件
     */
    private void moveView(final View view) {
        //获得整个屏幕的宽、高
        WindowManager wWM = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        final int w = wWM.getDefaultDisplay().getWidth();
        final int h = wWM.getDefaultDisplay().getHeight();
        //监听
        view.setOnTouchListener(new View.OnTouchListener() {
            private int startX;
            private int startY;
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {
                    //按下(执行1次)
                    case MotionEvent.ACTION_DOWN:
                        //手指按下时的那个坐标:离左边界、上边界的距离
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();
                        break;
                    //移动(执行N次)
                    case MotionEvent.ACTION_MOVE:
                        //1.手指滑动后那个坐标:距离左边界、上边界的距离
                        int moveX = (int) event.getRawX();
                        int moveY = (int) event.getRawY();
                        //2.滑动后-按下时=手指移动了多少距离(X、Y)
                        int moveLengthX = moveX - startX;
                        int moveLengthY = moveY - startY;
                        //3.算出移动了多少距离之后,
                        //就可以把控件当前所在位置的上下边+手指移动的Y距离;左右边+手指移动的X距离,这样移动后控件应该出现的位置就很明确了
                        int left = view.getLeft() + moveLengthX;
                        int top = view.getTop() + moveLengthY;
                        int right = view.getRight() + moveLengthX;
                        int bottom = view.getBottom() + moveLengthY;
                        //按个人需要增添:以下判断是防止控件被拖出屏幕(可以先不加然后看看效果)
                        if (bottom>h-70||left<0||top<0||right>w) {
                            //减70是减去手机最上面的状态栏的高度,不同手机状态栏高度不同,自己调节
                            return true;
                        }
                        //4.把控件定位到移动后的位置
                        view.layout(left, top, right, bottom);
                        //5.把这个位置又作为起始坐标
                        startX = (int) event.getRawX();
                        startY = (int) event.getRawY();
                        break;
                    //抬起(执行1次)
                    case MotionEvent.ACTION_UP:
                    //本次监听结束:如果你要做回显的话就把现在控件位置存进SharedPreferences偏好设置里,下次进界面时取出来,初始化控件到这个位置

                        break;
                }
                //如果只设置控件能拖拽就返回true,如果既设置拖拽又设置了点击事件就返回false
                return true;
            }
        });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值