|
@@ -1,8 +1,14 @@
|
|
package com.xunao.effectdemo.activity;
|
|
package com.xunao.effectdemo.activity;
|
|
|
|
|
|
|
|
+import android.animation.Animator;
|
|
|
|
+import android.animation.TypeEvaluator;
|
|
|
|
+import android.animation.ValueAnimator;
|
|
import android.app.Activity;
|
|
import android.app.Activity;
|
|
import android.content.ClipData;
|
|
import android.content.ClipData;
|
|
import android.content.Intent;
|
|
import android.content.Intent;
|
|
|
|
+import android.graphics.PointF;
|
|
|
|
+import android.os.Handler;
|
|
|
|
+import android.os.Message;
|
|
import android.os.SystemClock;
|
|
import android.os.SystemClock;
|
|
import android.os.Bundle;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import android.util.Log;
|
|
@@ -11,15 +17,25 @@ import android.view.HapticFeedbackConstants;
|
|
import android.view.MotionEvent;
|
|
import android.view.MotionEvent;
|
|
import android.view.View;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.ViewGroup;
|
|
|
|
+import android.view.animation.Animation;
|
|
|
|
+import android.view.animation.DecelerateInterpolator;
|
|
|
|
+import android.view.animation.TranslateAnimation;
|
|
|
|
+import android.widget.Button;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.ImageView;
|
|
import android.widget.ImageView;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.RelativeLayout;
|
|
import android.widget.RelativeLayout;
|
|
|
|
|
|
|
|
+import androidx.annotation.NonNull;
|
|
|
|
+
|
|
import com.xunao.effectdemo.R;
|
|
import com.xunao.effectdemo.R;
|
|
|
|
+import com.xunao.effectdemo.bean.ListBean;
|
|
import com.xunao.effectdemo.dragview.DragViewUtil;
|
|
import com.xunao.effectdemo.dragview.DragViewUtil;
|
|
import com.xunao.effectdemo.view.MaskFilterView;
|
|
import com.xunao.effectdemo.view.MaskFilterView;
|
|
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.List;
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* author : 程中强
|
|
* author : 程中强
|
|
* e-mail : 740479946@qq.com
|
|
* e-mail : 740479946@qq.com
|
|
@@ -30,13 +46,14 @@ import com.xunao.effectdemo.view.MaskFilterView;
|
|
public class TestActivity extends Activity {
|
|
public class TestActivity extends Activity {
|
|
private final static String TAG = "DragViewActivity";
|
|
private final static String TAG = "DragViewActivity";
|
|
/** 三个容器 */
|
|
/** 三个容器 */
|
|
- private RelativeLayout view1_container;
|
|
|
|
|
|
+ private LinearLayout view1_container;
|
|
private LinearLayout view2_container;
|
|
private LinearLayout view2_container;
|
|
private LinearLayout view3_container;
|
|
private LinearLayout view3_container;
|
|
|
|
+ private LinearLayout view4_container;
|
|
/** 三要个拖动view */
|
|
/** 三要个拖动view */
|
|
private LinearLayout view1;
|
|
private LinearLayout view1;
|
|
private LinearLayout view2;
|
|
private LinearLayout view2;
|
|
- private LinearLayout view3;
|
|
|
|
|
|
+ private LinearLayout view3,view_4;
|
|
|
|
|
|
private RelativeLayout view_1;
|
|
private RelativeLayout view_1;
|
|
private LinearLayout view_2;
|
|
private LinearLayout view_2;
|
|
@@ -45,6 +62,34 @@ public class TestActivity extends Activity {
|
|
|
|
|
|
private MaskFilterView mask;
|
|
private MaskFilterView mask;
|
|
private View v1;
|
|
private View v1;
|
|
|
|
+ private ListBean bean;
|
|
|
|
+ private List<ListBean> beanList = new ArrayList<>();//用于记录数据
|
|
|
|
+
|
|
|
|
+ private List<LinearLayout> mlist = new ArrayList<>();
|
|
|
|
+ boolean isResult = false;
|
|
|
|
+ private Button btn;
|
|
|
|
+ Animation animDown,animUp;
|
|
|
|
+ private boolean isClose = false;
|
|
|
|
+ private List<View> list = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ private Handler handler = new Handler(new Handler.Callback() {
|
|
|
|
+ @Override
|
|
|
|
+ public boolean handleMessage(@NonNull Message message) {
|
|
|
|
+ switch (message.what){
|
|
|
|
+ case 1:
|
|
|
|
+ Log.e("MyTag","获取消息"+isResult);
|
|
|
|
+ if (isResult){
|
|
|
|
+ isResult = false;
|
|
|
|
+ setResult();
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
|
|
@Override
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
@@ -56,6 +101,7 @@ public class TestActivity extends Activity {
|
|
view1_container = findViewById(R.id.view1_container);
|
|
view1_container = findViewById(R.id.view1_container);
|
|
view2_container = findViewById(R.id.view2_container);
|
|
view2_container = findViewById(R.id.view2_container);
|
|
view3_container = findViewById(R.id.view3_container);
|
|
view3_container = findViewById(R.id.view3_container);
|
|
|
|
+ view4_container = findViewById(R.id.view4_container);
|
|
//三个可拖拽view
|
|
//三个可拖拽view
|
|
view1 = findViewById(R.id.view1);
|
|
view1 = findViewById(R.id.view1);
|
|
view2 = findViewById(R.id.view2);
|
|
view2 = findViewById(R.id.view2);
|
|
@@ -64,107 +110,385 @@ public class TestActivity extends Activity {
|
|
view_1 = findViewById(R.id.view_1);
|
|
view_1 = findViewById(R.id.view_1);
|
|
view_2 = findViewById(R.id.view_2);
|
|
view_2 = findViewById(R.id.view_2);
|
|
view_3 = findViewById(R.id.view_3);
|
|
view_3 = findViewById(R.id.view_3);
|
|
|
|
+ view_4 = findViewById(R.id.view_4);
|
|
|
|
+ list.add(view_1);
|
|
|
|
+ list.add(view_2);
|
|
|
|
+ list.add(view_3);
|
|
|
|
+ list.add(view_4);
|
|
|
|
|
|
v1 = findViewById(R.id.v1);
|
|
v1 = findViewById(R.id.v1);
|
|
v1.setOnClickListener(v->{});
|
|
v1.setOnClickListener(v->{});
|
|
- DragViewUtil.registerDragAction(v1);
|
|
|
|
- Log.e("MyTag","x:"+view1_container.getPivotX()+" y:"+view1_container.getPivotY());
|
|
|
|
- view1_container.setOnClickListener(v->{});
|
|
|
|
- DragViewUtil.registerDragAction(view1_container);
|
|
|
|
- view2_container.setOnClickListener(v->{});
|
|
|
|
- DragViewUtil.registerDragAction(view2_container);
|
|
|
|
-// DragViewUtil.registerDragAction(mask);
|
|
|
|
- //拖拽view1触摸事件
|
|
|
|
-// view1.setOnTouchListener(onTouchListener);
|
|
|
|
-// view2.setOnTouchListener(onTouchListener);
|
|
|
|
-// view3.setOnTouchListener(onTouchListener);
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 整理为一个通用的拖拽回调逻辑.所有容器view设置这个回调对象.
|
|
|
|
- *
|
|
|
|
- * 拖拽回调解释: 当一个view被拖拽的时候,系统会回调任何可见的view(包括被拖拽view自己)的OnDragListener,
|
|
|
|
- * 当然如果view没设置OnDragListener不会被系统回调.
|
|
|
|
- *
|
|
|
|
- */
|
|
|
|
- View.OnDragListener onDragListener1 = new View.OnDragListener() {
|
|
|
|
|
|
+
|
|
|
|
+ mlist.add(view1_container);
|
|
|
|
+ mlist.add(view2_container);
|
|
|
|
+ mlist.add(view3_container);
|
|
|
|
+ mlist.add(view4_container);
|
|
|
|
+
|
|
|
|
+ setTouchText(view1_container);
|
|
|
|
+ setTouchText(view2_container);
|
|
|
|
+ setTouchText(view3_container);
|
|
|
|
+ setTouchText(view4_container);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ btn = findViewById(R.id.btn);
|
|
|
|
+ btn.setOnClickListener(v->setResult());
|
|
|
|
+ handler.post(runnable);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Runnable runnable = new Runnable() {
|
|
|
|
+ @Override
|
|
|
|
+ public void run() {
|
|
|
|
+ beanList.clear();
|
|
|
|
+ for (int i=0;i<4;i++){
|
|
|
|
+ bean = new ListBean();
|
|
|
|
+ bean.setView(mlist.get(i));
|
|
|
|
+ Log.e("MyTag","top:"+mlist.get(i).getTop()+" left:"+mlist.get(i).getLeft());
|
|
|
|
+ bean.setAnswer((i+1)%4);
|
|
|
|
+ bean.setNum(i);
|
|
|
|
+ bean.setStatus(false);
|
|
|
|
+ beanList.add(bean);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 计算最后答案
|
|
|
|
+ */
|
|
|
|
+ void setResult(){
|
|
|
|
+ for (ListBean b: beanList){
|
|
|
|
+ if (b.getAnswer() != b.getNum()){
|
|
|
|
+ for (ListBean b2: beanList){
|
|
|
|
+ if (b2.getNum() == b.getAnswer()){
|
|
|
|
+ isResult = true;
|
|
|
|
+ changeToView(b.getView(),b2.getView(),500);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //交换2个view
|
|
|
|
+ private void changeToView(ViewGroup v1p,ViewGroup v2p,int time){
|
|
|
|
+
|
|
|
|
+ int num;
|
|
|
|
+ for (ListBean b:beanList){
|
|
|
|
+ if (b.getView().getId() == v1p.getId()){
|
|
|
|
+ num = b.getNum();
|
|
|
|
+ for (ListBean b2:beanList){
|
|
|
|
+ if (b2.getView().getId() == v2p.getId()){
|
|
|
|
+ b.setNum(b2.getNum());
|
|
|
|
+ b2.setNum(num);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ moveToWord(v2p,v1p,time);
|
|
|
|
+ moveToWord2(v1p,v2p,time);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private float downX;
|
|
|
|
+ private float downY;
|
|
|
|
+ private long downTime;
|
|
|
|
+ private long delay;
|
|
|
|
+ private boolean isMove;
|
|
|
|
+ private boolean canDrag;
|
|
|
|
+ private int left,enfLeft;
|
|
|
|
+ private int top,endTop;
|
|
|
|
+
|
|
|
|
+ void setTouchText(View view){
|
|
|
|
+
|
|
|
|
+ view.setOnClickListener(v1->{});
|
|
|
|
+ view.setOnTouchListener(new View.OnTouchListener() {
|
|
@Override
|
|
@Override
|
|
- public boolean onDrag(View view, DragEvent dragEvent) {
|
|
|
|
- Log.i(TAG, "container.onDrag called======");
|
|
|
|
- switch (dragEvent.getAction()) {
|
|
|
|
- case DragEvent.ACTION_DRAG_STARTED://开始.当有view被拖的时候收到此事件
|
|
|
|
-// Log.i(TAG, "开始");
|
|
|
|
- if (viewCover==null||viewCover != view ){
|
|
|
|
- viewCover = view;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case DragEvent.ACTION_DRAG_ENTERED://进入.当被拖view手指按压的位置进入本view的瞬间收到此事件
|
|
|
|
-// Log.i(TAG, "进入");
|
|
|
|
- if (viewCover==null||viewCover != view ){
|
|
|
|
- viewCover = view;
|
|
|
|
- Log.e("MyTag","进入新的");
|
|
|
|
- }
|
|
|
|
|
|
+ public boolean onTouch(View v, MotionEvent event) {
|
|
|
|
+ switch (event.getAction()) {
|
|
|
|
+ case MotionEvent.ACTION_DOWN:
|
|
|
|
+ downX = event.getX();
|
|
|
|
+ downY = event.getY();
|
|
|
|
+ isMove = false;
|
|
|
|
+ downTime = System.currentTimeMillis();
|
|
|
|
+ top = v.getTop();
|
|
|
|
+ left = v.getLeft();
|
|
|
|
+ canDrag = true;
|
|
|
|
+ v.bringToFront();
|
|
break;
|
|
break;
|
|
- case DragEvent.ACTION_DRAG_LOCATION://位于.当被拖view手指按压的位置在本view上方的时候收到此事件
|
|
|
|
- Log.i(TAG, "位于上方");
|
|
|
|
|
|
+ case MotionEvent.ACTION_MOVE:
|
|
|
|
|
|
- //此时dragEvent里包含要被拖view
|
|
|
|
|
|
+ if (!canDrag) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ final float xDistance = event.getX() - downX;
|
|
|
|
+ final float yDistance = event.getY() - downY;
|
|
|
|
+ enfLeft = (int)v.getX();
|
|
|
|
+ endTop = (int)v.getY();
|
|
|
|
+ if (xDistance != 0 && yDistance != 0) {
|
|
|
|
+ int l = (int) (v.getLeft() + xDistance);
|
|
|
|
+ int r = (int) (l + v.getWidth());
|
|
|
|
+ int t = (int) (v.getTop() + yDistance);
|
|
|
|
+ int b = (int) (t + v.getHeight());
|
|
|
|
+ v.setLeft(l);
|
|
|
|
+ v.setTop(t);
|
|
|
|
+ v.setRight(r);
|
|
|
|
+ v.setBottom(b);
|
|
|
|
+ isMove = true;
|
|
|
|
+ }
|
|
|
|
+ Log.e("MyTag","x:" + v.getY());
|
|
|
|
+ if(Math.abs(v.getY())<200&&!isClose){
|
|
|
|
+ isClose = true;
|
|
|
|
+// handler.sendEmptyMessage(2);
|
|
|
|
|
|
- break;
|
|
|
|
- case DragEvent.ACTION_DROP://丢入.当被拖view在本view上方手指释放开,收到此事件
|
|
|
|
-// Log.i(TAG, "丢入");
|
|
|
|
- Log.i(TAG, "丢入view_container2");
|
|
|
|
- View draggingView = (View) dragEvent.getLocalState();
|
|
|
|
- //当前容器
|
|
|
|
- ViewGroup thisContainer = ((ViewGroup) view);
|
|
|
|
- //被拖拽view覆盖的view
|
|
|
|
- View coveredView = thisContainer.getChildAt(1);
|
|
|
|
- //当拖拽的view跟被覆盖的view不同时
|
|
|
|
- if (draggingView != coveredView) {
|
|
|
|
- ViewGroup draggingViewContainer = (ViewGroup) draggingView.getParent();
|
|
|
|
- //两个容器交换子view
|
|
|
|
- thisContainer.removeView(coveredView);
|
|
|
|
- draggingViewContainer.removeView(draggingView);
|
|
|
|
- thisContainer.addView(draggingView);
|
|
|
|
- draggingViewContainer.addView(coveredView);
|
|
|
|
|
|
+ for (ListBean b:beanList){
|
|
|
|
+ if (b.getView().getId() == view.getId()){
|
|
|
|
+ closeView(list.get(b.getNum()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
- case DragEvent.ACTION_DRAG_EXITED://出去.当被拖view手指按压位置从本view拖出去收到此事件
|
|
|
|
-// Log.i(TAG, "出去");
|
|
|
|
- break;
|
|
|
|
- case DragEvent.ACTION_DRAG_ENDED://结束.手指释放拖拽结束收到此事件.
|
|
|
|
|
|
+ case MotionEvent.ACTION_UP:
|
|
|
|
+
|
|
|
|
+ int l = left;
|
|
|
|
+ int r = (int) (l + v.getWidth());
|
|
|
|
+ int t = top;
|
|
|
|
+ int b = (int) (t + v.getHeight());
|
|
|
|
|
|
|
|
+ v.setLeft(l);
|
|
|
|
+ v.setTop(t);
|
|
|
|
+ v.setRight(r);
|
|
|
|
+ v.setBottom(b);
|
|
|
|
+ judgeView(v,enfLeft,endTop);
|
|
|
|
+ isClose = false;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- //一定要为true
|
|
|
|
- return true;
|
|
|
|
|
|
+ return isMove;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void judgeView(View view,int left,int top){
|
|
|
|
+ for (ListBean b:beanList){
|
|
|
|
+ if (b.getView().getId() != view.getId()){
|
|
|
|
+ if (Math.abs(b.getView().getX()-left)<50&&
|
|
|
|
+ Math.abs(b.getView().getY()-top)<50){
|
|
|
|
+ changeToView((ViewGroup)view,b.getView(),0);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- };
|
|
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- //container设置拖拽监听, 感知其他view的拖动
|
|
|
|
-// view1_container.setOnDragListener(onDragListener1);
|
|
|
|
-// view2_container.setOnDragListener(onDragListener1);
|
|
|
|
-// view3_container.setOnDragListener(onDragListener1);
|
|
|
|
|
|
+ private void closeView(View v){
|
|
|
|
+ v.clearAnimation();
|
|
|
|
+ animUp= new TranslateAnimation(0, 0, 0, 40);
|
|
|
|
+ animUp.setDuration(400);
|
|
|
|
+ animUp.setRepeatCount(0);//动画的反复次数
|
|
|
|
+ animUp.setFillAfter(true);//设置为true,动画转化结束后被应用
|
|
|
|
+ animUp.setAnimationListener(new Animation.AnimationListener() {
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationStart(Animation animation) {
|
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationEnd(Animation animation) {
|
|
|
|
|
|
- private View.OnTouchListener onTouchListener = new View.OnTouchListener() {
|
|
|
|
- @Override
|
|
|
|
- public boolean onTouch(View view, MotionEvent motionEvent) {
|
|
|
|
- //定义一个裁剪数据对象.随便定义一个就行,本demo用不到这个clipData.
|
|
|
|
-// ClipData clipData = new ClipData(ClipData.newPlainText("view1", "aaa"));
|
|
|
|
-//
|
|
|
|
-// //定义一个拖拽阴影
|
|
|
|
-// View.DragShadowBuilder myShadow = new View.DragShadowBuilder(view);
|
|
|
|
|
|
+// LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) v.getLayoutParams();
|
|
|
|
+// layoutParams.topMargin = -20;
|
|
|
|
+// layoutParams.bottomMargin = -20;
|
|
|
|
+// layoutParams.height = 260;
|
|
|
|
+// v.setLayoutParams(layoutParams);
|
|
|
|
+// for (ListBean bean:beanList){
|
|
|
|
+// if (bean.getView() == viewGroup){
|
|
//
|
|
//
|
|
-// //开始拖拽. 第三个参数在拖拽过程用来传递数据,这里我传view即被拖动的view自己,
|
|
|
|
-// //后面可在DragEvent中获得这个参数view
|
|
|
|
-// view.startDrag(clipData, myShadow, view, 0);
|
|
|
|
|
|
+// bean.setStatus(true);
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationRepeat(Animation animation) {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ v.startAnimation(animUp);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private void moveToWord(View view, View targetView,int time) {
|
|
|
|
+ final float x = view.getX();
|
|
|
|
+ final float y = view.getY();
|
|
|
|
+
|
|
|
|
+ final float targetX = targetView.getX();
|
|
|
|
+ final float targetY = targetView.getY();
|
|
|
|
+ ValueAnimator valueAnimator = new ValueAnimator();
|
|
|
|
+ valueAnimator.setDuration(time);//600
|
|
|
|
+ valueAnimator.setObjectValues(new PointF(x, y));
|
|
|
|
+ valueAnimator.setInterpolator(new DecelerateInterpolator());
|
|
|
|
+ //首先判断 目标点在上还是在下
|
|
|
|
+ final boolean flagX = ((x - targetX) > 0) ? true : false;
|
|
|
|
+ final boolean flagY = ((y - targetY) > 0) ? true : false;
|
|
|
|
+ valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
|
|
|
|
+ @Override
|
|
|
|
+ public PointF evaluate(float fraction, PointF startValue,
|
|
|
|
+ PointF endValue) {
|
|
|
|
+ //从0.0 --->> 1.0
|
|
|
|
+ PointF point = new PointF();
|
|
|
|
+ //这里是需要倒着来 最后要到达200 200 这个点
|
|
|
|
+
|
|
|
|
+ float fractionNeed = 1 - fraction;
|
|
|
|
+
|
|
|
|
+ if (flagX) {
|
|
|
|
+ float vX = x - targetX;
|
|
|
|
+ point.x = vX * fractionNeed + targetX;
|
|
|
|
+ } else {
|
|
|
|
+ float vX = targetX - x;
|
|
|
|
+ point.x = x + vX * fraction;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (flagY) {
|
|
|
|
+ float vY = y - targetY;
|
|
|
|
+ point.y = vY * fractionNeed + targetY;
|
|
|
|
+ } else {
|
|
|
|
+ float vY = targetY - y;
|
|
|
|
+ point.y = y + vY * fraction;
|
|
|
|
+ }
|
|
|
|
+ return point;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ valueAnimator.start();
|
|
|
|
+ valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationUpdate(ValueAnimator animation) {
|
|
|
|
+ PointF point = (PointF) animation.getAnimatedValue();
|
|
|
|
+ float vX = point.x;
|
|
|
|
+ float vY = point.y;
|
|
|
|
+ //说明vx 最大值就是view原坐标
|
|
|
|
+ if (flagX) {
|
|
|
|
+ if (vX <= x && vX >= targetX) {
|
|
|
|
+ view.setX(vX);
|
|
|
|
+ }
|
|
|
|
+ } else {//说明vx 最小值就是view原坐标
|
|
|
|
+ if (vX >= x && vX <= targetX) {
|
|
|
|
+ view.setX(vX);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //说明vY 最大值就是view原坐标
|
|
|
|
+ if (flagY) {
|
|
|
|
+ if (vY <= y && vY >= targetY) {
|
|
|
|
+ view.setY(vY);
|
|
|
|
+ }
|
|
|
|
+ } else {//说明vx 最小值就是view原坐标
|
|
|
|
+ if (vY >= y && vY <= targetY) {
|
|
|
|
+ view.setY(vY);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+// view.setLeft(targetView.getLeft());
|
|
|
|
+// view.setTop(targetView.getTop());
|
|
|
|
+// view.setRight(targetView.getWidth());
|
|
|
|
+// view.setBottom(targetView.getHeight());
|
|
|
|
+ }
|
|
|
|
+ private void moveToWord2(View view, View targetView,int time) {
|
|
|
|
+ final float x = view.getX();
|
|
|
|
+ final float y = view.getY();
|
|
|
|
+
|
|
|
|
+ final float targetX = targetView.getX();
|
|
|
|
+ final float targetY = targetView.getY();
|
|
|
|
+ ValueAnimator valueAnimator = new ValueAnimator();
|
|
|
|
+ valueAnimator.setDuration(time);//600
|
|
|
|
+ valueAnimator.setObjectValues(new PointF(x, y));
|
|
|
|
+ valueAnimator.setInterpolator(new DecelerateInterpolator());
|
|
|
|
+ //首先判断 目标点在上还是在下
|
|
|
|
+ final boolean flagX = ((x - targetX) > 0) ? true : false;
|
|
|
|
+ final boolean flagY = ((y - targetY) > 0) ? true : false;
|
|
|
|
+
|
|
|
|
+ valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public PointF evaluate(float fraction, PointF startValue,
|
|
|
|
+ PointF endValue) {
|
|
|
|
+ //从0.0 --->> 1.0
|
|
|
|
+
|
|
|
|
+ PointF point = new PointF();
|
|
|
|
+ //这里是需要倒着来 最后要到达200 200 这个点
|
|
|
|
+
|
|
|
|
+ float fractionNeed = 1 - fraction;
|
|
|
|
+
|
|
|
|
+ if (flagX) {
|
|
|
|
+ float vX = x - targetX;
|
|
|
|
+ point.x = vX * fractionNeed + targetX;
|
|
|
|
+ } else {
|
|
|
|
+ float vX = targetX - x;
|
|
|
|
+ point.x = x + vX * fraction;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (flagY) {
|
|
|
|
+ float vY = y - targetY;
|
|
|
|
+ point.y = vY * fractionNeed + targetY;
|
|
|
|
+ } else {
|
|
|
|
+ float vY = targetY - y;
|
|
|
|
+ point.y = y + vY * fraction;
|
|
|
|
+ }
|
|
|
|
+ return point;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ valueAnimator.addListener(new Animator.AnimatorListener() {
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationStart(Animator animator) {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationEnd(Animator animator) {
|
|
|
|
+
|
|
|
|
+ handler.sendEmptyMessage(1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationCancel(Animator animator) {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationRepeat(Animator animator) {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ valueAnimator.start();
|
|
|
|
+ valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
|
|
|
|
+ @Override
|
|
|
|
+ public void onAnimationUpdate(ValueAnimator animation) {
|
|
|
|
+ PointF point = (PointF) animation.getAnimatedValue();
|
|
|
|
+ float vX = point.x;
|
|
|
|
+ float vY = point.y;
|
|
|
|
+ //说明vx 最大值就是view原坐标
|
|
|
|
+ if (flagX) {
|
|
|
|
+ if (vX <= x && vX >= targetX) {
|
|
|
|
+ view.setX(vX);
|
|
|
|
+ }
|
|
|
|
+ } else {//说明vx 最小值就是view原坐标
|
|
|
|
+ if (vX >= x && vX <= targetX) {
|
|
|
|
+ view.setX(vX);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //说明vY 最大值就是view原坐标
|
|
|
|
+ if (flagY) {
|
|
|
|
+ if (vY <= y && vY >= targetY) {
|
|
|
|
+ view.setY(vY);
|
|
|
|
+ }
|
|
|
|
+ } else {//说明vx 最小值就是view原坐标
|
|
|
|
+ if (vY >= y && vY <= targetY) {
|
|
|
|
+ view.setY(vY);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|