DragViewUtil.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package com.xunao.effectdemo.dragview;
  2. import android.util.Log;
  3. import android.view.DragEvent;
  4. import android.view.MotionEvent;
  5. import android.view.View;
  6. /**
  7. * author : 程中强
  8. * e-mail : 740479946@qq.com
  9. * date : 2022/8/1013:28
  10. * desc :
  11. * version: 1.0
  12. */
  13. public class DragViewUtil {
  14. public static void registerDragAction(View v) {
  15. registerDragAction(v, 0);
  16. }
  17. /**
  18. * 拖动View方法
  19. *
  20. * @param v view
  21. * @param delay 延迟
  22. */
  23. public static void registerDragAction(View v, long delay) {
  24. v.setOnTouchListener(new TouchListener(delay));
  25. v.setOnDragListener(onDragListener1);
  26. }
  27. private static class TouchListener implements View.OnTouchListener {
  28. private float downX;
  29. private float downY;
  30. private long downTime;
  31. private long delay;
  32. private boolean isMove;
  33. private boolean canDrag;
  34. private int left;
  35. private int top;
  36. private TouchListener() {
  37. this(0);
  38. }
  39. private TouchListener(long delay) {
  40. this.delay = delay;
  41. }
  42. private boolean haveDelay() {
  43. return delay > 0;
  44. }
  45. @Override
  46. public boolean onTouch(View v, MotionEvent event) {
  47. switch (event.getAction()) {
  48. case MotionEvent.ACTION_DOWN:
  49. downX = event.getX();
  50. downY = event.getY();
  51. isMove = false;
  52. downTime = System.currentTimeMillis();
  53. top = v.getTop();
  54. left = v.getLeft();
  55. Log.e("MyTag","top:"+top+ " left:"+left+" w:h"+v.getWidth()+":"+v.getHeight());
  56. if (haveDelay()) {
  57. canDrag = false;
  58. } else {
  59. canDrag = true;
  60. }
  61. v.bringToFront();
  62. break;
  63. case MotionEvent.ACTION_MOVE:
  64. if (haveDelay() && !canDrag) {
  65. long currMillis = System.currentTimeMillis();
  66. if (currMillis - downTime >= delay) {
  67. canDrag = true;
  68. }
  69. }
  70. if (!canDrag) {
  71. break;
  72. }
  73. final float xDistance = event.getX() - downX;
  74. final float yDistance = event.getY() - downY;
  75. Log.e("MyTag","x:" + event.getX() + " y:"+event.getY());
  76. if (xDistance != 0 && yDistance != 0) {
  77. int l = (int) (v.getLeft() + xDistance);
  78. int r = (int) (l + v.getWidth());
  79. int t = (int) (v.getTop() + yDistance);
  80. int b = (int) (t + v.getHeight());
  81. // v.layout(l, t, r, b);
  82. v.setLeft(l);
  83. v.setTop(t);
  84. v.setRight(r);
  85. v.setBottom(b);
  86. // v.bringToFront();
  87. isMove = true;
  88. }
  89. break;
  90. case MotionEvent.ACTION_UP:
  91. int l = left;
  92. int r = (int) (l + v.getWidth());
  93. int t = top;
  94. int b = (int) (t + v.getHeight());
  95. // v.layout(l, t, r, b);
  96. v.setLeft(l);
  97. v.setTop(t);
  98. v.setRight(r);
  99. v.setBottom(b);
  100. break;
  101. default:
  102. break;
  103. }
  104. return isMove;
  105. }
  106. }
  107. private static View.OnDragListener onDragListener1 = new View.OnDragListener() {
  108. @Override
  109. public boolean onDrag(View view, DragEvent dragEvent) {
  110. switch (dragEvent.getAction()) {
  111. case DragEvent.ACTION_DRAG_STARTED://开始.当有view被拖的时候收到此事件
  112. break;
  113. case DragEvent.ACTION_DRAG_ENTERED://进入.当被拖view手指按压的位置进入本view的瞬间收到此事件
  114. break;
  115. case DragEvent.ACTION_DRAG_LOCATION://位于.当被拖view手指按压的位置在本view上方的时候收到此事件
  116. break;
  117. case DragEvent.ACTION_DROP://丢入.当被拖view在本view上方手指释放开,收到此事件
  118. break;
  119. case DragEvent.ACTION_DRAG_EXITED://出去.当被拖view手指按压位置从本view拖出去收到此事件
  120. // Log.i(TAG, "出去");
  121. break;
  122. case DragEvent.ACTION_DRAG_ENDED://结束.手指释放拖拽结束收到此事件.
  123. View draggingView = (View) dragEvent.getLocalState();
  124. draggingView.setVisibility(View.VISIBLE);
  125. break;
  126. default:
  127. break;
  128. }
  129. //一定要为true
  130. return true;
  131. }
  132. };
  133. }