实现可自由拖动的view

来源:互联网 发布:学拼音软件 一年级 编辑:程序博客网 时间:2024/05/29 03:16

查了网上的资料,大部分实都是给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;                }            });
0 0
原创粉丝点击