Преглед на файлове

Merge branch 'master' of http://116.62.119.248:10082/cheng_zq/EffectDemo into lwz_

LAPTOP-K69FCNBP\crius преди 2 години
родител
ревизия
e778eab460

+ 1 - 1
.idea/misc.xml

@@ -16,7 +16,7 @@
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_stars.xml" value="0.12" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_test.xml" value="0.18" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_test2.xml" value="0.17" />
-        <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_umeng_login.xml" value="0.18" />
+        <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_umeng_login.xml" value="0.1" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_view.xml" value="0.25" />
         <entry key="..\:/Progect/gitee/EffectDemo/app/src/main/res/layout/activity_web.xml" value="0.1816123188405797" />
         <entry key="..\:/work/mozhi/qiqu/EffectDemo/app/src/main/res/layout/activity_congratulations.xml" value="0.15274949083503056" />

+ 0 - 1
app/src/main/java/com/xunao/effectdemo/activity/Test2Activity.java

@@ -479,7 +479,6 @@ public class Test2Activity extends Activity {
 		}
 		moveToWord(v2p,v1p,time);
 		moveToWord2(v1p,v2p,time);
-
 	}
 
 	void addView(View v1,View v2,ViewGroup v1p,ViewGroup v2p,LinearLayout llShow){

+ 407 - 83
app/src/main/java/com/xunao/effectdemo/activity/TestActivity.java

@@ -1,8 +1,14 @@
 package com.xunao.effectdemo.activity;
 
+import android.animation.Animator;
+import android.animation.TypeEvaluator;
+import android.animation.ValueAnimator;
 import android.app.Activity;
 import android.content.ClipData;
 import android.content.Intent;
+import android.graphics.PointF;
+import android.os.Handler;
+import android.os.Message;
 import android.os.SystemClock;
 import android.os.Bundle;
 import android.util.Log;
@@ -11,15 +17,25 @@ import android.view.HapticFeedbackConstants;
 import android.view.MotionEvent;
 import android.view.View;
 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.ImageView;
 import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
 
+import androidx.annotation.NonNull;
+
 import com.xunao.effectdemo.R;
+import com.xunao.effectdemo.bean.ListBean;
 import com.xunao.effectdemo.dragview.DragViewUtil;
 import com.xunao.effectdemo.view.MaskFilterView;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * author : 程中强
  * e-mail : 740479946@qq.com
@@ -30,13 +46,14 @@ import com.xunao.effectdemo.view.MaskFilterView;
 public class TestActivity extends Activity {
 	private final static String TAG = "DragViewActivity";
 	/** 三个容器 */
-	private RelativeLayout view1_container;
+	private LinearLayout view1_container;
 	private LinearLayout view2_container;
 	private LinearLayout view3_container;
+	private LinearLayout view4_container;
 	/** 三要个拖动view */
 	private LinearLayout view1;
 	private LinearLayout view2;
-	private LinearLayout view3;
+	private LinearLayout view3,view_4;
 
 	private RelativeLayout view_1;
 	private LinearLayout view_2;
@@ -45,6 +62,34 @@ public class TestActivity extends Activity {
 
 	private MaskFilterView mask;
 	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
 	protected void onCreate(Bundle savedInstanceState) {
@@ -56,6 +101,7 @@ public class TestActivity extends Activity {
 		view1_container = findViewById(R.id.view1_container);
 		view2_container = findViewById(R.id.view2_container);
 		view3_container = findViewById(R.id.view3_container);
+		view4_container = findViewById(R.id.view4_container);
 		//三个可拖拽view
 		view1 = findViewById(R.id.view1);
 		view2 = findViewById(R.id.view2);
@@ -64,107 +110,385 @@ public class TestActivity extends Activity {
 		view_1 = findViewById(R.id.view_1);
 		view_2 = findViewById(R.id.view_2);
 		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.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
-			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;
-					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;
-					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;
 					default:
 						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);
+					}
+				}
+			}
+		});
+	}
 
 }

+ 2 - 0
app/src/main/java/com/xunao/effectdemo/bean/ListBean.java

@@ -15,6 +15,8 @@ public class ListBean {
 	private int num;//当前赛道
 	private int answer;//正确答案
 	private boolean status;//状态,闭合true,正常false
+	private int top;
+	private int left;
 
 	public LinearLayout getView() {
 		return view;

+ 10 - 4
app/src/main/res/layout/activity_test.xml

@@ -5,6 +5,12 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
+    <Button
+        android:id="@+id/btn"
+        android:text="计算"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
     <View
         android:id="@+id/v1"
         android:visibility="gone"
@@ -42,12 +48,12 @@
             android:orientation="vertical">
 
             <TextView
-                android:layout_centerInParent="true"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="aaa"/>
+                android:layout_centerInParent="true"
+                android:text="aaa" />
         </RelativeLayout>
-        <RelativeLayout
+        <LinearLayout
             android:layout_marginTop="100dp"
             android:id="@+id/view1_container"
             android:layout_width="wrap_content"
@@ -69,7 +75,7 @@
                     android:text="aaa" />
             </LinearLayout>
 
-        </RelativeLayout>
+        </LinearLayout>
 
         <LinearLayout
             android:id="@+id/view_2"