DragSelectActivity.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. package com.xunao.effectdemo.activity;
  2. import android.animation.Animator;
  3. import android.animation.TypeEvaluator;
  4. import android.animation.ValueAnimator;
  5. import android.app.Activity;
  6. import android.graphics.PointF;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.Message;
  10. import android.util.Log;
  11. import android.view.MotionEvent;
  12. import android.view.View;
  13. import android.view.animation.Animation;
  14. import android.view.animation.DecelerateInterpolator;
  15. import android.view.animation.RotateAnimation;
  16. import android.view.animation.ScaleAnimation;
  17. import android.view.animation.TranslateAnimation;
  18. import android.widget.ImageView;
  19. import android.widget.SeekBar;
  20. import androidx.annotation.NonNull;
  21. import androidx.annotation.Nullable;
  22. import com.xuexiang.xui.widget.imageview.RadiusImageView;
  23. import com.xunao.effectdemo.R;
  24. /**
  25. * author : 程中强
  26. * e-mail : 740479946@qq.com
  27. * date : 2022/8/1716:43
  28. * desc :
  29. * version: 1.0
  30. */
  31. public class DragSelectActivity extends Activity {
  32. private View view;
  33. private float downX;
  34. private float downY;
  35. private float inX;
  36. private float inY;
  37. private long downTime;
  38. private long delay;
  39. private boolean isMove;
  40. private boolean canDrag;
  41. private float left;
  42. private float top;
  43. private int lestLeft,lestTop;
  44. RadiusImageView imv1,imv2;
  45. private float setAlpha;
  46. ScaleAnimation scaleAnim;
  47. private SeekBar seek;
  48. private float scale,toScale;
  49. private RotateAnimation leftAnim,rightAnim;
  50. private boolean isLeft,isRight;
  51. private Animation returnAnim;
  52. Handler handler = new Handler(new Handler.Callback() {
  53. @Override
  54. public boolean handleMessage(@NonNull Message message) {
  55. switch (message.what){
  56. case 1:
  57. imv1.setAlpha(setAlpha);
  58. break;
  59. }
  60. return false;
  61. }
  62. });
  63. @Override
  64. protected void onCreate(@Nullable Bundle savedInstanceState) {
  65. super.onCreate(savedInstanceState);
  66. setContentView(R.layout.activity_drag_select);
  67. init();
  68. }
  69. void init(){
  70. leftAnim = new RotateAnimation(0f,-30f,Animation.ABSOLUTE,0.5f,Animation.ABSOLUTE,0.5f);
  71. leftAnim.setDuration(300);
  72. leftAnim.setRepeatCount(0);
  73. leftAnim.setFillAfter(true);
  74. rightAnim = new RotateAnimation(0f,30f,Animation.ABSOLUTE,0.5f,Animation.ABSOLUTE,0.5f);
  75. rightAnim.setDuration(300);
  76. rightAnim.setRepeatCount(0);
  77. rightAnim.setFillAfter(true);
  78. view = findViewById(R.id.view);
  79. imv1 = findViewById(R.id.imv_1);
  80. seek = findViewById(R.id.seek);
  81. imv2 = findViewById(R.id.imv_2);
  82. // imv2.setAlpha(0.3f);
  83. // imv1.setAlpha(0.3f);
  84. scale = 1f;
  85. Log.e("MyTag","获取:"+getWindow().getWindowManager().getDefaultDisplay().getHeight());
  86. view.setOnClickListener(v->{});
  87. view.setOnTouchListener(new View.OnTouchListener() {
  88. @Override
  89. public boolean onTouch(View v, MotionEvent event) {
  90. switch (event.getAction()) {
  91. case MotionEvent.ACTION_DOWN:
  92. downX = event.getX();
  93. downY = event.getY();
  94. isMove = true;
  95. downTime = System.currentTimeMillis();
  96. top = v.getTop();
  97. left = v.getLeft();
  98. v.bringToFront();
  99. inX = view.getX();
  100. inY = view.getY();
  101. break;
  102. case MotionEvent.ACTION_MOVE:
  103. final float xDistance = event.getX() - downX;
  104. final float yDistance = event.getY() - downY;
  105. Log.e("MyTag","x:" + v.getLeft() + " y:"+event.getY());
  106. if (xDistance != 0 && yDistance != 0) {
  107. lestLeft = (int) (v.getLeft() + xDistance);
  108. int r = (int) (lestLeft + v.getWidth());
  109. lestTop = (int) (v.getTop() + yDistance);
  110. int b = (int) (lestTop + v.getHeight());
  111. // v.layout(l, t, r, b);
  112. v.setLeft(lestLeft);
  113. v.setTop(lestTop);
  114. v.setRight(r);
  115. v.setBottom(b);
  116. isMove = true;
  117. // imv1.setImageAlpha();
  118. setAnim(v.getLeft());
  119. }
  120. break;
  121. case MotionEvent.ACTION_UP:
  122. isLeft = false;
  123. isRight = false;
  124. view.clearAnimation();
  125. int l = (int)left;
  126. int r = (int) (l + v.getWidth());
  127. int t = (int)top;
  128. int b = (int) (t + v.getHeight());
  129. // v.layout(l, t, r, b);
  130. v.setLeft(l);
  131. v.setTop(t);
  132. v.setRight(r);
  133. v.setBottom(b);
  134. setReturn(lestLeft,lestTop);
  135. // moveToWord(view,left,top,500,l,r,t,b);
  136. isMove = false;
  137. imv1.setAlpha(0.3f);
  138. imv1.clearAnimation();
  139. imv2.setAlpha(0.3f);
  140. imv2.clearAnimation();
  141. scale = 1f;
  142. break;
  143. default:
  144. break;
  145. }
  146. return isMove;
  147. }
  148. });
  149. }
  150. private void setReturn(float endLeft,float endTop){
  151. returnAnim = new TranslateAnimation(endLeft-left,0,endTop-top,0);
  152. returnAnim.setDuration(500);
  153. view.startAnimation(returnAnim);
  154. }
  155. private void setAnim(int l){
  156. if (left-l>0){
  157. setAlpha = ((float)left-l)/left ;
  158. if (!isLeft){
  159. isLeft = true;
  160. isRight = false;
  161. view.clearAnimation();
  162. view.startAnimation(leftAnim);
  163. }
  164. if (setAlpha>0.3){
  165. imv1.setAlpha(setAlpha);
  166. }
  167. toScale = 2*setAlpha+1;
  168. scaleAnim = new ScaleAnimation(scale, toScale, scale, toScale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  169. scaleAnim.setDuration(0);
  170. scale = toScale;
  171. scaleAnim.setFillAfter(true);
  172. imv1.startAnimation(scaleAnim);
  173. }else if(left-l<0){
  174. if (!isRight){
  175. isRight = true;
  176. isLeft = false;
  177. view.clearAnimation();
  178. view.startAnimation(rightAnim);
  179. }
  180. setAlpha = ((float)l-left)/left ;
  181. if (setAlpha>0.3){
  182. imv2.setAlpha(setAlpha);
  183. }
  184. toScale = 2*setAlpha+1;
  185. scaleAnim = new ScaleAnimation(scale, toScale, scale, toScale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  186. scaleAnim.setDuration(0);
  187. scale = toScale;
  188. scaleAnim.setFillAfter(true);
  189. imv2.startAnimation(scaleAnim);
  190. }
  191. }
  192. private void moveToWord(View view ,float targetX, float targetY, int time,int l,int r,int t,int b) {
  193. final float x = view.getX();
  194. final float y = view.getY();
  195. // final float targetX = targetView.getX();
  196. // final float targetY = targetView.getY();
  197. ValueAnimator valueAnimator = new ValueAnimator();
  198. valueAnimator.setDuration(time);//600
  199. valueAnimator.setObjectValues(new PointF(x, y));
  200. valueAnimator.setInterpolator(new DecelerateInterpolator());
  201. //首先判断 目标点在上还是在下
  202. final boolean flagX = ((x - targetX) > 0) ? true : false;
  203. final boolean flagY = ((y - targetY) > 0) ? true : false;
  204. valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
  205. @Override
  206. public PointF evaluate(float fraction, PointF startValue,
  207. PointF endValue) {
  208. //从0.0 --->> 1.0
  209. PointF point = new PointF();
  210. //这里是需要倒着来 最后要到达200 200 这个点
  211. float fractionNeed = 1 - fraction;
  212. if (flagX) {
  213. float vX = x - targetX;
  214. point.x = vX * fractionNeed + targetX;
  215. } else {
  216. float vX = targetX - x;
  217. point.x = x + vX * fraction;
  218. }
  219. if (flagY) {
  220. float vY = y - targetY;
  221. point.y = vY * fractionNeed + targetY;
  222. } else {
  223. float vY = targetY - y;
  224. point.y = y + vY * fraction;
  225. }
  226. return point;
  227. }
  228. });
  229. valueAnimator.addListener(new Animator.AnimatorListener() {
  230. @Override
  231. public void onAnimationStart(Animator animator) {
  232. }
  233. @Override
  234. public void onAnimationEnd(Animator animator) {
  235. // view.setLeft(l);
  236. // view.setTop(t);
  237. // view.setRight(r);
  238. // view.setBottom(b);
  239. }
  240. @Override
  241. public void onAnimationCancel(Animator animator) {
  242. }
  243. @Override
  244. public void onAnimationRepeat(Animator animator) {
  245. }
  246. });
  247. valueAnimator.start();
  248. valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  249. @Override
  250. public void onAnimationUpdate(ValueAnimator animation) {
  251. PointF point = (PointF) animation.getAnimatedValue();
  252. float vX = point.x;
  253. float vY = point.y;
  254. //说明vx 最大值就是view原坐标
  255. if (flagX) {
  256. if (vX <= x && vX >= targetX) {
  257. view.setX(vX);
  258. }
  259. } else {//说明vx 最小值就是view原坐标
  260. if (vX >= x && vX <= targetX) {
  261. view.setX(vX);
  262. }
  263. }
  264. //说明vY 最大值就是view原坐标
  265. if (flagY) {
  266. if (vY <= y && vY >= targetY) {
  267. view.setY(vY);
  268. }
  269. } else {//说明vx 最小值就是view原坐标
  270. if (vY >= y && vY <= targetY) {
  271. view.setY(vY);
  272. }
  273. }
  274. }
  275. });
  276. }
  277. }