您的位置:首页 > 其它

实现可自由拖动的view

2016-09-19 19:27 274 查看
查了网上的资料,大部分实都是给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;
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  view 拖动 click