实现可自由拖动的view
2016-09-19 19:27
274 查看
查了网上的资料,大部分实都是给view 设置一个ontouch listener,在ontouch中获取当前的坐标,然后调用layout()方法,实现view 的重新定位。
后来发现这个方法有问题,当整个界面需要刷新的时候,页面重新绘制以下,这个被移动的view又回到了初始位置!令人头疼,大家都说是因为没有将layoutparams保存下来,找了半天也没找到保存的办法!
终于在无意中看到了一个极简的方法,Thank goodness !终于得到了解救。
就是这个简单的方法,本来是设置动画的,当duration设置为0 的时候,便很顺畅地用到了view的自由移动
以下 是全部,完成的是一个view实现边缘拖动的效果,此外,还要响应onclick 事件,因为touch事件会跟click事件冲突,因此,用touch事件自定义了click事件,当时间和移动的距离都小于click的阈值时,就认为click事件发生了
后来发现这个方法有问题,当整个界面需要刷新的时候,页面重新绘制以下,这个被移动的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桌面时找不到域的解决方法
- 完全克隆的虚拟桌面部署问题
- 移除VMware View桌面中孤立的主机与桌面池
- Jquery对新插入的节点 绑定Click事件失效的解决方法
- 实例讲解JavaScript的Backbone.js框架中的View视图
- jQuery拖动元素并对元素进行重新排序
- Android中View自定义组合控件的基本编写方法
- Android 自定义View步骤
- Android自定义View仿QQ健康界面
- Android重写View实现全新的控件
- 解读ASP.NET 5 & MVC6系列教程(16):自定义View视图文件查找逻辑
- VC++实现View内容保存为图片的方法
- 据说是Google首页的网页模块拖动代码
- Backbone View 之间通信的三种方式
- Backbone中View之间传值的学习心得
- 轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
- javascript实现淡蓝色的鼠标拖动选择框实例
- JS实现超简单的鼠标拖动效果
- javascript实现的元素拖动函数宿主为浏览器
- javascript弹出拖动窗口