页面中可拖拽控件的简单实现方案
2018-03-13 09:10
435 查看
页面中可拖拽控件的简单实现,可直接一句话实现.
核心代码逻辑类如下:import android.animation.ObjectAnimator; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import android.view.animation.DecelerateInterpolator; /** * 控件拖动逻辑处理 * Created by WQ on 2017/10/23. */ public class ViewDragMode implements View.OnTouchListener{ private View targetView; public ViewDragMode(final View targetView) { this.targetView=targetView; this.targetView.setOnTouchListener(this); } private int parentHeight; private int parentWidth; private int lastX; private int lastY; private boolean isDrag; @Override public boolean onTouch(View v, MotionEvent event) { int rawX = (int) event.getRawX(); int rawY = (int) event.getRawY(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: targetView.setPressed(true); isDrag = false; ViewParent viewParent = targetView.getParent(); viewParent.requestDisallowInterceptTouchEvent(true); lastX = rawX; lastY = rawY; ViewGroup parent; parent = (ViewGroup) viewParent; parentHeight = parent.getHeight(); parentWidth = parent.getWidth(); break; case MotionEvent.ACTION_MOVE: if (parentHeight <= 0 || parentWidth == 0) { isDrag = false; break; } else { isDrag = true; } int dx = rawX - lastX; int dy = rawY - lastY; //这里修复一些华为手机无法触发点击事件 int distance = (int) Math.sqrt(dx * dx + dy * dy); if (distance == 0) { isDrag = false; break; } float x = targetView.getX() + dx; float y = targetView.getY() + dy; //检测是否到达边缘 左上右下 x = x < 0 ? 0 : x > parentWidth - targetView.getWidth() ? parentWidth - targetView.getWidth() : x; y = targetView.getY() < 0 ? 0 : targetView.getY() + targetView.getHeight() > parentHeight ? parentHeight - targetView.getHeight() : y; targetView.setX(x); targetView.setY(y); lastX = rawX; lastY = rawY; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (!isNotDrag()) { //恢复按压效果 targetView.setPressed(false); if (rawX >= parentWidth / 2) { //靠右吸附 targetView.animate().setInterpolator(new DecelerateInterpolator()) .setDuration(500) .xBy(parentWidth - targetView.getWidth() - targetView.getX()) .start(); } else { //靠左吸附 ObjectAnimator oa = ObjectAnimator.ofFloat(targetView, "x", targetView.getX(), 0); oa.setInterpolator(new DecelerateInterpolator()); oa.setDuration(500); oa.start(); } } break; } //如果是拖拽则消s耗事件,否则正常传递即可。 return !isNotDrag() || targetView.onTouchEvent(event); } /** * 是否拖拽中 * @return */ public boolean isDraging(){ return isDrag; } private boolean isNotDrag() { if(targetView ==null)return true; return !isDrag ; } }
使用方法:
ViewDragMode(targetView)
targetView 为悬浮可拖拽的目标控件.实现的效果是,该控件可在父容器范围内进行拖拽,并自动左右吸边.
该工具类提供
isDraging()方法判断是否处于拖拽中,用于解决一些滑动冲突的问题.
相关文章推荐
- android 简单实现可拖拽控件
- asp.net简单实现禁用或启用页面中的某一类型的控件
- React弹框、Toast、弹出页面等简单实现方案(百达通)
- asp.net简单页面控件赋值实现方法
- [NGUI]基于UIDragDropItem脚本实现简单的控件拖拽
- 简单高级搜索页面的简单实现,包括数据控件循环嵌套,DataTable动态生成数据添加等
- iOS实现一个简单的页面切换控件
- asp.net 简单实现禁用或启用页面中的某一类型的控件
- asp.net 简单实现禁用或启用页面中的某一类型的控件
- Android开发-UI控件:实现登陆页面并跳转和简单的注册页面
- asp.net 简单实现禁用或启用页面中的某一类型的控件
- C#简单实现对控件的拖拽
- 快速实现简单高效并可以灵活配置的URL重写方案(附源代码)
- 一个超简单的JS拖拽实现代码(兼容IE,Firefox)
- eclipse搭建简单springboot-mybatis项目实现页面简单跳转
- SpringCloud(第 023 篇)简单文件上传微服务采取curl或者页面点击实现文件上传
- php+jQuery+Ajax简单实现页面异步刷新
- jQuery实现的简单拖拽功能示例【测试可用】