实现可自由拖动的view

查了网上的资料,大部分实都是给view 设置一个ontouch listener,在ontouch中获取当前的坐标,然后调用layout()方法,实现view 的重新定位。

后来发现这个方法有问题,当整个界面需要刷新的时候,页面重新绘制以下,这个被移动的view又回到了初始位置!令人头疼,大家都说是因为没有将layoutparams保存下来,找了半天也没找到保存的办法!

终于在无意中看到了一个极简的方法,Thank goodness !终于得到了解救。

就是这个简单的方法,本来是设置动画的,当duration设置为0 的时候,便很顺畅地用到了view的自由移动

  v.animate()
  .y(rawY + offsetY)
  .setDuration(0)
  .start();

以下 是全部,完成的是一个view实现边缘拖动的效果,此外,还要响应onclick 事件,因为touch事件会跟click事件冲突,因此,用touch事件自定义了click事件,当时间和移动的距离都小于click的阈值时,就认为click事件发生了

     mNineBoxContainer.setOnTouchListener(new OnTouchListener() {
                int lastY;
                long startTouchTime, endTouchTime;
                long clickDuration = 200;
                float startTouchX, startTouchY, endTouchX, endTouchY;

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int rawX = (int) event.getRawX();
                    int rawY = (int) event.getRawY();
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            startTouchX = event.getRawX();
                            startTouchY = event.getRawY();
                            startTouchTime = System.currentTimeMillis();
                            lastY = rawY;
                            break;
                        case MotionEvent.ACTION_MOVE:
                            if(rawY < 0)
                            {
                                rawY = 0;
                            }
                            if(rawY > screenWidth - v.getMeasuredHeight())
                            {
                                rawY = screenWidth - v.getMeasuredHeight();
                            }
                            int offsetY = rawY - lastY;
                            v.animate()
                                    .y(rawY + offsetY)
                                    .setDuration(0)
                                    .start();
                            lastY = rawY;
                            break;
                        case MotionEvent.ACTION_UP:
                            endTouchTime = System.currentTimeMillis();
                            endTouchX = rawX;
                            endTouchY = rawY;
                            if (endTouchTime - startTouchTime <= clickDuration) {
                                double distance = Math.sqrt(Math.abs(endTouchX - startTouchX) * Math.abs(endTouchX - startTouchX) + Math.abs(endTouchY - startTouchY) * Math.abs(endTouchY - startTouchY));//两点之间的距离
                                if (distance < 15) { // 距离较小,当作click事件来处理
                                    if (mNineBoxFloatManager != null) {
                                        mNineBoxFloatManager.showNineBoxLayer(true);
                                    }
                                }
                            }
                            lastY = rawY;
                            break;
                    }
                    return true;
                }
            });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值