可以自由拖动的view

    技术2024-06-01  68

    看了一下几篇别人的可以自由拖动的view,发现还留下个问题(就是下一次点击时会回到起点),太坑了。 其中主要逻辑引用https://www.jianshu.com/p/3856dedad3af 只是修复了点击下一次会回到起点的问题,有问题欢迎评论

    public class DragLayout extends ViewGroup{ private String tag = getClass().getSimpleName(); private int layoutWidth; private int layoutHeight; private float downX; private float downY; int screenWidth = 0; int screenHeight = 0; int l, r, t, b; // 上下左右四点移动后的偏移量 public LocalCameraPreview(Context context) { this(context, null); } public LocalCameraPreview(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onLayout(final boolean changed, final int left, final int top, final int right, final int bottom) { super.onLayout(changed, left, top, right, bottom); //屏幕宽度高度 screenWidth = DisplayUtil.getScreenWidth(); screenHeight = DisplayUtil.getScreenHeight(); //布局的宽度高度 layoutWidth = right - left; layoutHeight = bottom - top; } public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); Log.e(tag, "onTouchEvent layoutWidth:" + layoutWidth); float distanceParentLeft = getX();//按下的触摸点X坐标 自己(View)的最左边距离父类最左边的距离 float distanceParentTop = getY();//按下的触摸点Y坐标 自己(View)的最上边距离父类最上边的具体 float distanceSelfLeft = event.getX();//按下的触摸点X坐标距离自己(View)最左边的距离 float distanceSelfTop = event.getY();//按下的触摸点Y坐标 具体自己(View)最上边的具体 int x = (int) event.getRawX(); //触摸点相对于屏幕的横坐标 int y = (int) event.getRawY(); //触摸点相对于屏幕的纵坐标 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getRawX();//屏幕的X坐标 downY = event.getRawY();//屏幕的Y坐标 break; case MotionEvent.ACTION_MOVE: //当手势类型为移动时 Log.e(tag, "downX" + downX); Log.e(tag, "moveX" + event.getX()); //记录最后的触摸位置 float endX = event.getRawX(); float endY = event.getRawY(); //计算移动的距离 float moveX = endX - downX; float moveY = endY - downY; //计算偏移量 设置偏移量 = 3 时 为判断点击事件和滑动事件的峰值 if (Math.abs(moveX) > 3 || Math.abs(moveY) > 3) { // 偏移量的绝对值大于 3 为 滑动时间 并根据偏移量计算四点移动后的位置 l = (int) (getX() + moveX); r = l + layoutWidth; t = (int) (getY() + moveY); b = t + layoutHeight; //边界判断,最大值为边界值 if (l < 0) { // left 小于 0 就是滑出边界 赋值为 0 ; right 右边的坐标就是自身宽度 如果可以划出边界 left right top bottom 最小值的绝对值 不能大于自身的宽高 l = 0; r = l + layoutWidth; } else if (r > screenWidth) { // 判断 right 并赋值 r = screenWidth; l = r - layoutWidth; } if (t < 0) { // top t = 0; b = t + layoutHeight; } else if (b > screenHeight) { // bottom b = screenHeight; t = b - layoutHeight; } this.layout(l, t, r, b); // 重置view在layout 中位置 //更新位置 downX = endX; downY = endY; } break; case MotionEvent.ACTION_UP: break; default: break; } return true; } }
    Processed: 0.018, SQL: 9