import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.up72.football.R; import com.up72.football.model.Data2DPlayerModel; import com.up72.football.utils.Constants; import com.up72.football.utils.Utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import jp.wasabeef.glide.transformations.CropCircleTransformation; /** * 2D直播控件 * Created by CZF on 2017/05/12. */ public class Live2DView extends FrameLayout { private OnItemClickListener onItemClickListener; private double fieldY = 0;//球场宽 y private double fieldX = 0;//球场高 x private boolean isSpeedKing; private boolean isAllHide = true; private boolean hideName;//是否隐藏名称 private double proportionx = 0; private double proportiony = 0; public Live2DView(Context context) { super(context); init(); } public Live2DView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public Live2DView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public void setFieldXY(double fieldX, double fieldY) { this.fieldY = fieldY; this.fieldX = fieldX; } // 球场直接的比例 public void setProportion(double proportionx, double proportiony) { this.proportionx = proportionx; this.proportiony = proportiony; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } private void init() { views.clear(); } /** * 是否处于都不显示状态 */ public void setAllHide(boolean isAllHide) { this.isAllHide = isAllHide; } public boolean isSpeedKing() { return this.isSpeedKing; } /** * 切换显示奔跑王和速度王 */ public void setSpeedKing(boolean isSpeedKing) { this.isSpeedKing = isSpeedKing; } private List<View> existView = new ArrayList<>(); private List<View> noExistView = new ArrayList<>(); private List<View> views = new ArrayList<>(); private Map<View, AnimatorSet> maps = new HashMap<>(); @TargetApi(Build.VERSION_CODES.KITKAT) public void pauseAnim(boolean isDown) { for (View view : maps.keySet()) { if (isDown) { maps.get(view).cancel(); view.clearAnimation(); } else { maps.get(view).pause(); } } } @TargetApi(Build.VERSION_CODES.KITKAT) public void resumeAnim(boolean isDown) { for (View view : maps.keySet()) { if (isDown) { maps.get(view).start(); } else { maps.get(view).resume(); } } } public void clearAllView() { maps.clear(); existView.clear(); noExistView.clear(); views.clear(); removeAllViews(); } public void clearViewByNonExistence(List<Data2DPlayerModel> list) { existView.clear(); noExistView.clear(); // TODO: 2017/5/15 找出 集合中所有在场的 View for (int i = 0; i < list.size(); i++) { for (int j = 0; j < views.size(); j++) { Data2DPlayerModel tagModel = (Data2DPlayerModel) views.get(j).getTag(); if (tagModel.getPlayerId() == list.get(i).getPlayerId()) { existView.add(views.get(j)); } } } TODO: 2017/5/15 用在场的 View 找出所有不在场的 for (int i = 0; i < views.size(); i++) { boolean isExist = false; for (int j = 0; j < existView.size(); j++) { if (existView.get(j) == views.get(i)) { isExist = true; break; } } if (!isExist) { android.util.Log.e("chenzefeng", "不存在的~~~"); noExistView.add(views.get(i)); } } for (int i = 0; i < noExistView.size(); i++) { android.util.Log.e("chenzefeng", "有一个换下"); noExistView.get(i).clearAnimation(); removeView(noExistView.get(i)); views.remove(noExistView.get(i)); } } /** * 添加2d直播数据 * youwenti * @param model */ public void addPoint(final Data2DPlayerModel model) { final int width = getMeasuredWidth(); final int height = getMeasuredHeight(); final int viewWidth = Utils.dip2px(getContext(), 60); final int viewHeight = Utils.dip2px(getContext(), 114); final int textHeight = Utils.dip2px(getContext(), 14); boolean isExist = false; for (int i = 0; i < views.size(); i++) { Data2DPlayerModel tagModel = (Data2DPlayerModel) views.get(i).getTag(); if (tagModel.getPlayerId() == model.getPlayerId()) { isExist = true; bindingData(views.get(i), model); // int xEnd = (int) ((model.getPoints().get(2).y / fieldY * 100.0) * width / 100 - viewWidth / 2); // int yEnd = (int) ((model.getPoints().get(2).x / fieldX * 100.0) * height / 100 - viewHeight); // // AnimatorSet animatorSet = new AnimatorSet();//组合动画 // ObjectAnimator translationX = ObjectAnimator.ofFloat(views.get(i), "translationX", views.get(i).getX(), xEnd); // ObjectAnimator translationY = ObjectAnimator.ofFloat(views.get(i), "translationY", views.get(i).getY(), yEnd + textHeight); // animatorSet.setDuration(2800); // animatorSet.setInterpolator(new DecelerateInterpolator()); // animatorSet.play(translationX).with(translationY);//两个动画同时开始 // animatorSet.start(); // TODO: 2017/5/16 应该可以支持回放暂停动画继续动画 final long duration = 6000;//总动画时间 if (maps.get(views.get(i)) != null) { maps.get(views.get(i)).cancel(); } views.get(i).clearAnimation(); AnimatorSet animatorSet = new AnimatorSet(); AnimatorSet.Builder builder = null; for (int j = 0; j < model.getPoints().size(); j++) { int xBegin; int yBegin; int xEnd; int yEnd; if (j == 0) { xBegin = (int) views.get(i).getX(); yBegin = (int) views.get(i).getY(); // xEnd = (int) ((model.getPoints().get(j).y / fieldY * 100.0) * width / 100 - viewWidth / 2); // yEnd = (int) ((model.getPoints().get(j).x / fieldY * 100.0) * height / 100 - viewHeight + textHeight); // 最新的球场计算公式 proportionx proportiony 第一个 if (proportiony >= fieldY) { double y = model.getPoints().get(j).x - proportionx; double x = proportiony - model.getPoints().get(j).y; if (Math.abs(y)>fieldX){ y=fieldX; } if (y<0){ y=1; } if (y>fieldY){ y =fieldY; } // xBegin = (int) ((y / fieldX * 100.0) * width / 100 - viewWidth / 2); // yBegin = (int) ((x / fieldY * 100.0) * height / 100 - viewHeight + textHeight); xEnd = (int) ((y / fieldY * 100.0) * width / 100 - viewWidth / 2); yEnd = (int) ((x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); // Log.i("info", "addPoint---xBegin非正常1111===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); // Log.i("info", "addPoint---xBegin非正常1111===================x"+ x + "y===" + y); Log.i("info", "addPoint---xBegin非正常1111===================X的结束"+xEnd+"Y的结束"+yEnd+"xxxxxx"+ x + "y===" + y); } else { xEnd = (int) Math.abs(((model.getPoints().get(j).y - proportiony) / fieldX * 100.0) * width / 100 - viewWidth / 2); yEnd = (int) Math.abs(((model.getPoints().get(j).x - proportionx) / fieldY * 100.0) * height / 100 - viewHeight + textHeight); Log.i("info", "addPoint---xBegin正常11111===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); int xx=(int) (model.getPoints().get(j).y - proportiony); int yy=(int)(model.getPoints().get(j).x - proportionx); Log.i("info", "addPoint---正常11111===XXXX"+xx+"YYYY"+yy); } } else { // xBegin = (int) ((model.getPoints().get(j - 1).y / fieldX * 100.0) * width / 100 - viewWidth / 2); // yBegin = (int) ((model.getPoints().get(j - 1).x / fieldY * 100.0) * height / 100 - viewHeight + textHeight); // // xEnd = (int) ((model.getPoints().get(j).y / fieldX * 100.0) * width / 100 - viewWidth / 2); // yEnd = (int) ((model.getPoints().get(j).x / fieldY * 100.0) * height / 100 - viewHeight + textHeight); // 第二个地方换算公式 if (proportiony >= fieldY) { double y = model.getPoints().get(j).x - proportionx; double x = proportiony - model.getPoints().get(j).y; if (Math.abs(y)>fieldX){ y=fieldX; } if (y<0){ y =1; } if (y>fieldY){ y =fieldY; } // proportiony -model.getPoints().get(j - 1).y double y2 = model.getPoints().get(j - 1).x - proportionx; double x2 = proportiony - model.getPoints().get(j - 1).y; if (Math.abs(y2)>fieldX){ y2=fieldX; } if (y2<0){ y2 =1; } if (y2>fieldY){ y2 =fieldY; } xBegin = (int) ((y2 / fieldY * 100.0) * width / 100 - viewWidth / 2); yBegin = (int) ((x2 / fieldX * 100.0) * height / 100 - viewHeight + textHeight); xEnd = (int) ((y / fieldY * 100.0) * width / 100 - viewWidth / 2); yEnd = (int) ((x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); // Log.i("info", "addPoint---xBegin非正常222222===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); Log.i("info", "addPoint---xBegin非正常222222===================X的开始"+xBegin+"Y的开始"+yBegin); Log.i("yyyyyyyy"+(j - 1),y2+""); Log.i("xxxxxxxx"+(j - 1),x2+"" ); Log.i("info", "addPoint---xBegin非正常222222===================x"+(j - 1)+"----->" + x + "y===" + y); } else { xBegin = (int) (((model.getPoints().get(j - 1).y - proportiony) / fieldX * 100.0) * width / 100 - viewWidth / 2); yBegin = (int) (((model.getPoints().get(j - 1).x - proportionx) / fieldY * 100.0) * height / 100 - viewHeight + textHeight); xEnd = (int) (((model.getPoints().get(j).y - proportiony) / fieldX * 100.0) * width / 100 - viewWidth / 2); yEnd = (int) (((model.getPoints().get(j).x - proportionx) / fieldY * 100.0) * height / 100 - viewHeight + textHeight); Log.i("info", "addPoint---xBegin正常22222===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); int xx=(int) (model.getPoints().get(j).y - proportiony); int yy=(int)(model.getPoints().get(j).x - proportionx); Log.i("info", "addPoint---正常2222===XXXX"+xx+"YYYY"+yy); } } try { ObjectAnimator translationX = ObjectAnimator.ofFloat(views.get(i), "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(views.get(i), "translationY", yBegin, yEnd); translationX.setStartDelay(j * (duration / model.getPoints().size())); translationY.setStartDelay(j * (duration / model.getPoints().size())); if (builder == null) { builder = animatorSet.play(translationX).with(translationY);//两个动画同时开始 } else { builder.with(translationX).with(translationY); } } catch (Exception e) { } } animatorSet.setDuration(duration / model.getPoints().size()); animatorSet.setInterpolator(new DecelerateInterpolator()); maps.put(views.get(i), animatorSet); maps.get(views.get(i)).start(); // final long duration = 3000;//总动画时间 // for (int j = 0; j < model.getPoints().size(); j++) { // final int finalJ = j; // final int finalI = i; // new Handler().postDelayed(new Runnable() { // @Override // public void run() { // int xEnd = (int) ((model.getPoints().get(finalJ).y / fieldY * 100.0) * width / 100 - viewWidth / 2); // int yEnd = (int) ((model.getPoints().get(finalJ).x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); // try { // AnimatorSet animatorSet = new AnimatorSet();//组合动画 // ObjectAnimator translationX = ObjectAnimator.ofFloat(views.get(finalI), "translationX", views.get(finalI).getX(), xEnd); // ObjectAnimator translationY = ObjectAnimator.ofFloat(views.get(finalI), "translationY", views.get(finalI).getY(), yEnd); // animatorSet.setDuration(duration / model.getPoints().size()); // animatorSet.setInterpolator(new DecelerateInterpolator()); // animatorSet.play(translationX).with(translationY);//两个动画同时开始 // animatorSet.start(); // } catch (Exception e) { // // } // } // }, j * (duration / model.getPoints().size())); // } break; } } if (!isExist) { View view = LayoutInflater.from(getContext()).inflate(R.layout.item_live2d, this, false); view.setLayerType(View.LAYER_TYPE_HARDWARE, null); bindingData(view, model); views.add(view); addView(view); if (model.getPoints() != null && model.getPoints().size() > 0) { // int xBegin = (int) ((model.getPoints().get(0).y / fieldX * 100.0) * width / 100 - viewWidth / 2); // int yBegin = (int) ((model.getPoints().get(0).x / fieldY * 100.0) * height / 100 - viewHeight + textHeight); // int xEnd = (int) ((model.getPoints().get(model.getPoints().size() - 1).y / fieldX * 100.0) * width / 100 - viewWidth / 2); // int yEnd = (int) ((model.getPoints().get(model.getPoints().size() - 1).x / fieldY * 100.0) * height / 100 - viewHeight + textHeight); // 第三个地方换算公式 if (proportiony >= fieldY) { double y = model.getPoints().get(0).x - proportionx; double x = proportiony - model.getPoints().get(0).y; int xBegin = (int) ((Math.abs(x) / fieldX * 100.0) * width / 100 - viewWidth / 2); int yBegin = (int) ((Math.abs(y) / fieldY * 100.0) * height / 100 - viewHeight + textHeight); int xEnd = (int) (Math.abs((proportiony - model.getPoints().get(model.getPoints().size() - 1).y) / fieldX * 100.0) * width / 100 - viewWidth / 2); int yEnd = (int) ((Math.abs(model.getPoints().get(model.getPoints().size() - 1).x - proportionx) / fieldY * 100.0) * height / 100 - viewHeight + textHeight); Log.i("info", "addPoint---xBegin非正常333333333===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); AnimatorSet animatorSet = new AnimatorSet();//组合动画 ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(view, "translationY", yBegin, yEnd); animatorSet.setDuration(3000); animatorSet.setInterpolator(new DecelerateInterpolator()); animatorSet.play(translationX).with(translationY);//两个动画同时开始 animatorSet.start(); } else { int xBegin = (int) (((model.getPoints().get(0).y - proportiony) / fieldX * 100.0) * width / 100 - viewWidth / 2); int yBegin = (int) (((model.getPoints().get(0).x - proportionx) / fieldY * 100.0) * height / 100 - viewHeight + textHeight); int xEnd = (int) (((model.getPoints().get(model.getPoints().size() - 1).y - proportiony) / fieldX * 100.0) * width / 100 - viewWidth / 2); int yEnd = (int) (((model.getPoints().get(model.getPoints().size() - 1).x - proportionx) / fieldY * 100.0) * height / 100 - viewHeight + textHeight); Log.i("info", " addPoint----xBegin正常333333333===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); AnimatorSet animatorSet = new AnimatorSet();//组合动画 ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(view, "translationY", yBegin, yEnd); animatorSet.setDuration(3000); animatorSet.setInterpolator(new DecelerateInterpolator()); animatorSet.play(translationX).with(translationY);//两个动画同时开始 animatorSet.start(); } // maps.put(view, animatorSet); // maps.get(view).start(); } } } /** * 添加2d直播数据 * 测试大2D 直播界面 * * @param model */ public void addnewPoint(final Data2DPlayerModel model) { final int width = getMeasuredWidth(); final int height = getMeasuredHeight(); final int viewWidth = Utils.dip2px(getContext(), 60); final int viewHeight = Utils.dip2px(getContext(), 114); final int textHeight = Utils.dip2px(getContext(), 14); boolean isExist = false; for (int i = 0; i < views.size(); i++) { Data2DPlayerModel tagModel = (Data2DPlayerModel) views.get(i).getTag(); if (tagModel.getPlayerId() == model.getPlayerId()) { isExist = true; bindingData(views.get(i), model); // TODO: 2017/5/16 应该可以支持回放暂停动画继续动画 final long duration = 3000;//总动画时间 if (maps.get(views.get(i)) != null) { maps.get(views.get(i)).cancel(); } views.get(i).clearAnimation(); AnimatorSet animatorSet = new AnimatorSet(); AnimatorSet.Builder builder = null; for (int j = 0; j < model.getPoints().size(); j++) { int xBegin; int yBegin; int xEnd; int yEnd; if (j == 0) { xBegin = (int) views.get(i).getX(); yBegin = (int) views.get(i).getY(); xEnd = (int) ((model.getPoints().get(j).y / fieldY * 100.0) * width / 100 - viewWidth / 2); yEnd = (int) ((model.getPoints().get(j).x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); } else { xBegin = (int) ((model.getPoints().get(j - 1).y / fieldY * 100.0) * width / 100 - viewWidth / 2); yBegin = (int) ((model.getPoints().get(j - 1).x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); xEnd = (int) ((model.getPoints().get(j).y / fieldY * 100.0) * width / 100 - viewWidth / 2); yEnd = (int) ((model.getPoints().get(j).x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); } try { ObjectAnimator translationX = ObjectAnimator.ofFloat(views.get(i), "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(views.get(i), "translationY", yBegin, yEnd); translationX.setStartDelay(j * (duration / model.getPoints().size())); translationY.setStartDelay(j * (duration / model.getPoints().size())); if (builder == null) { builder = animatorSet.play(translationX).with(translationY);//两个动画同时开始 } else { builder.with(translationX).with(translationY); } } catch (Exception e) { } } animatorSet.setDuration(duration / model.getPoints().size()); animatorSet.setInterpolator(new DecelerateInterpolator()); maps.put(views.get(i), animatorSet); maps.get(views.get(i)).start(); break; } } if (!isExist) { View view = LayoutInflater.from(getContext()).inflate(R.layout.item_live2d, this, false); view.setLayerType(View.LAYER_TYPE_HARDWARE, null); bindingData(view, model); views.add(view); addView(view); if (model.getPoints() != null && model.getPoints().size() > 0) { int xBegin = (int) ((model.getPoints().get(0).y / fieldY * 100.0) * width / 100 - viewWidth / 2); int yBegin = (int) ((model.getPoints().get(0).x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); int xEnd = (int) ((model.getPoints().get(model.getPoints().size() - 1).y / fieldY * 100.0) * width / 100 - viewWidth / 2); int yEnd = (int) ((model.getPoints().get(model.getPoints().size() - 1).x / fieldX * 100.0) * height / 100 - viewHeight + textHeight); AnimatorSet animatorSet = new AnimatorSet();//组合动画 ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(view, "translationY", yBegin, yEnd); animatorSet.setDuration(3000); animatorSet.setInterpolator(new DecelerateInterpolator()); animatorSet.play(translationX).with(translationY);//两个动画同时开始 animatorSet.start(); } } } private void bindingData(View view, Data2DPlayerModel model) { FrameLayout layBack = (FrameLayout) view.findViewById(R.id.layBack); ImageView ivAvatar = (ImageView) view.findViewById(R.id.ivAvatar); TextView tvName = (TextView) view.findViewById(R.id.tvName); TextView tvKing = (TextView) view.findViewById(R.id.tvKing); tvKing.setVisibility(INVISIBLE); tvKing.setBackgroundResource(0); if (model.isHomeTeam()) { layBack.setBackgroundResource(R.drawable.ic_bubble_blue); if (!isAllHide) { if (!model.getRunKing().equals("") && !isSpeedKing) { tvKing.setText(model.getRunKing() + "km"); tvKing.setBackgroundResource(R.drawable.ic_live2d_run); tvKing.setVisibility(VISIBLE); layBack.setBackgroundResource(R.drawable.ic_bubble_blue_king); } else if (!model.getSpeedKing().equals("") && isSpeedKing) { tvKing.setText(model.getSpeedKing() + "m/s"); tvKing.setBackgroundResource(R.drawable.ic_live2d_speed); tvKing.setVisibility(VISIBLE); layBack.setBackgroundResource(R.drawable.ic_bubble_blue_king); } } if (model.isChangeUp()) { layBack.setBackgroundResource(R.drawable.ic_bubble_blue_up); } } else { layBack.setBackgroundResource(R.drawable.ic_bubble_red); if (!isAllHide) { if (!model.getRunKing().equals("") && !isSpeedKing) { tvKing.setText(model.getRunKing() + "km"); tvKing.setBackgroundResource(R.drawable.ic_live2d_run); tvKing.setVisibility(VISIBLE); layBack.setBackgroundResource(R.drawable.ic_bubble_red_king); } else if (!model.getSpeedKing().equals("") && isSpeedKing) { tvKing.setText(model.getSpeedKing() + "m/s"); tvKing.setBackgroundResource(R.drawable.ic_live2d_speed); tvKing.setVisibility(VISIBLE); layBack.setBackgroundResource(R.drawable.ic_bubble_red_king); } } if (model.isChangeUp()) { layBack.setBackgroundResource(R.drawable.ic_bubble_red_up); } } Glide.with(getContext()).load(Constants.RequestUrl.baseImageUrl + model.getPlayerImg()). placeholder(R.drawable.ic_default_user). error(R.drawable.ic_default_user). bitmapTransform(new CropCircleTransformation(getContext())). dontAnimate().into(ivAvatar); tvName.setText(model.getPlayerName()); tvName.setVisibility(hideName ? INVISIBLE : VISIBLE); view.setTag(model); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (onItemClickListener != null && v.getTag() instanceof Data2DPlayerModel) { onItemClickListener.onItemClick((Data2DPlayerModel) v.getTag()); } } }); } /** * 添加迷你2d直播数据 * * @param model */ public void addMini2DPoint(final Data2DPlayerModel model) { final int width = getMeasuredWidth(); final int height = getMeasuredHeight(); final int viewWidth = Utils.dip2px(getContext(), 32); final int viewHeight = Utils.dip2px(getContext(), 32); boolean isExist = false; for (int i = 0; i < views.size(); i++) { Data2DPlayerModel tagModel = (Data2DPlayerModel) views.get(i).getTag(); if (tagModel.getPlayerId() == model.getPlayerId()) { isExist = true; bindingMinData((TextView) views.get(i), model); // int xEnd = (int) ((Math.round(model.getPoints().get(2).x / fieldX * 100.0)) * width / 100 - viewWidth / 2); // int yEnd = (int) (height - (Math.round(model.getPoints().get(2).y / fieldY * 100.0)) * height / 100 - viewHeight / 2); // // AnimatorSet animatorSet = new AnimatorSet();//组合动画 // ObjectAnimator translationX = ObjectAnimator.ofFloat(views.get(i), "translationX", views.get(i).getX(), xEnd); // ObjectAnimator translationY = ObjectAnimator.ofFloat(views.get(i), "translationY", views.get(i).getY(), yEnd); // animatorSet.setDuration(2500); // animatorSet.setInterpolator(new DecelerateInterpolator()); // animatorSet.play(translationX).with(translationY);//两个动画同时开始 // animatorSet.start(); // final long duration = 3000;//总动画时间 // for (int j = 0; j < model.getPoints().size(); j++) { // final int finalJ = j; // final int finalI = i; // new Handler().postDelayed(new Runnable() { // @Override // public void run() { // int xEnd = (int) ((Math.round(model.getPoints().get(finalJ).x / fieldX * 100.0)) * width / 100 - viewWidth / 2); // int yEnd = (int) (height - (Math.round(model.getPoints().get(finalJ).y / fieldY * 100.0)) * height / 100 - viewHeight / 2); // // AnimatorSet animatorSet = new AnimatorSet();//组合动画 // ObjectAnimator translationX = ObjectAnimator.ofFloat(views.get(finalI), "translationX", views.get(finalI).getX(), xEnd); // ObjectAnimator translationY = ObjectAnimator.ofFloat(views.get(finalI), "translationY", views.get(finalI).getY(), yEnd); // animatorSet.setDuration(duration / model.getPoints().size()); // animatorSet.setInterpolator(new DecelerateInterpolator()); // animatorSet.play(translationX).with(translationY);//两个动画同时开始 // animatorSet.start(); // } // }, j * (duration / model.getPoints().size())); // } // TODO: 2017/5/16 应该可以支持回放暂停动画继续动画 final long duration = 3000;//总动画时间 if (maps.get(views.get(i)) != null) { maps.get(views.get(i)).cancel(); } views.get(i).clearAnimation(); AnimatorSet animatorSet = new AnimatorSet(); AnimatorSet.Builder builder = null; // 当前球员的坐标 for (int j = 0; j < model.getPoints().size(); j++) { int xBegin = 0; int yBegin = 0; int xEnd = 0; int yEnd = 0; if (j == 0) { xBegin = (int) views.get(i).getX(); yBegin = (int) views.get(i).getY(); if (proportiony >= fieldY) { // 第一种 double y = model.getPoints().get(j).x - proportionx; double x = proportiony - model.getPoints().get(j).y; if (Math.abs(y)>fieldY){ y=fieldY; } if (y<0){ y=1; } xEnd = (int) ((Math.round(x / fieldX * 100.0)) * width / 100 - viewWidth / 2); yEnd = (int) (height - (Math.round(y / fieldY * 100.0)) * height / 100 - viewHeight / 2); Log.i("info", "addMini2DPoint---xBegin非正常11111===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); Log.i("info", "addMini2DPoint---x非正常11111===================x" + x + "y===" + y); } else { xEnd = (int) ((Math.round((model.getPoints().get(j).x - proportionx) / fieldX * 100.0)) * width / 100 - viewWidth / 2); yEnd = (int) (height - (Math.round((model.getPoints().get(j).y - proportiony) / fieldY * 100.0)) * height / 100 - viewHeight / 2); Log.i("info", "addMini2DPoint---xBegin正常11111===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); int xx=(int) (model.getPoints().get(j).y - proportiony); int yy=(int)(model.getPoints().get(j).x - proportionx); Log.i("info", "addMini2DPoint---正常11111===XXXX"+xx+"YYYY"+yy); } } else { if (proportiony >= fieldY) { double y = model.getPoints().get(j).x - proportionx; double x = proportiony - model.getPoints().get(j).y; if (Math.abs(y)>fieldY){ y=fieldY; } if (y<0){ y=1; } double y2 = model.getPoints().get(j - 1).x - proportionx; double x2 = proportiony - model.getPoints().get(j - 1).y; if (Math.abs(y2)>fieldX){ y2=fieldX; } if (y2<0){ y2 =1; } xBegin = (int) ((Math.round(x2/ fieldX * 100.0)) * width / 100 - viewWidth / 2); yBegin = (int) (height - (Math.round(y2 / fieldY * 100.0)) * height / 100 - viewHeight / 2); xEnd = (int) ((Math.round(x / fieldX * 100.0)) * width / 100 - viewWidth / 2); yEnd = (int) (height - (Math.round(y / fieldY * 100.0)) * height / 100 - viewHeight / 2); Log.i("info", "addMini2DPoint---xBegin非正常22222===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); Log.i("info", "addMini2DPoint---x非正常222222===================x" + x + "y===" + y); } else { xBegin = (int) ((Math.round(Math.abs(model.getPoints().get(j - 1).x - proportionx) / fieldX * 100.0)) * width / 100 - viewWidth / 2); yBegin = (int) Math.abs(height - (Math.round((model.getPoints().get(j - 1).y - proportiony) / fieldY * 100.0)) * height / 100 - viewHeight / 2); xEnd = (int) ((Math.round(Math.abs(model.getPoints().get(j).x - proportionx) / fieldX * 100.0)) * width / 100 - viewWidth / 2); yEnd = (int) (height - (Math.round((model.getPoints().get(j).y - proportiony) / fieldY * 100.0)) * height / 100 - viewHeight / 2); Log.i("info", "addMini2DPoint---xBegin正常22222===" + xBegin + "yBegin===" + yBegin + "xEnd===" + xEnd + "yEnd===" + yEnd); } } try { ObjectAnimator translationX = ObjectAnimator.ofFloat(views.get(i), "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(views.get(i), "translationY", yBegin, yEnd); translationX.setStartDelay(j * (duration / model.getPoints().size())); translationY.setStartDelay(j * (duration / model.getPoints().size())); if (builder == null) { builder = animatorSet.play(translationX).with(translationY);//两个动画同时开始 } else { builder.with(translationX).with(translationY); } } catch (Exception e) { } } animatorSet.setDuration(duration / model.getPoints().size()); animatorSet.setInterpolator(new DecelerateInterpolator()); maps.put(views.get(i), animatorSet); maps.get(views.get(i)).start(); break; } } if (!isExist) { TextView tvPlayerNum = (TextView) LayoutInflater.from(getContext()).inflate(R.layout.item_mini_live2d, this, false); bindingMinData(tvPlayerNum, model); views.add(tvPlayerNum); addView(tvPlayerNum); if (model.getPoints() != null && model.getPoints().size() > 0) { if (proportiony >= fieldY) { double y = model.getPoints().get(0).x - proportionx; double x = proportiony - model.getPoints().get(0).y; Log.i("info","非正常-====xx"+x+"y====="+y); int xBegin = (int) (Math.round((x / fieldX * 100.0)) * width / 100 - viewWidth / 2); int yBegin = (int) (height - (Math.round(y / fieldY * 100.0)) * height / 100 - viewHeight / 2); int xEnd = (int) ((Math.round(Math.abs(proportiony - model.getPoints().get(2).y) / fieldX * 100.0)) * width / 100 - viewWidth / 2); int yEnd = (int) (height - (Math.round(Math.abs(model.getPoints().get(2).x - proportionx) / fieldY * 100.0)) * height / 100 - viewHeight / 2); AnimatorSet animatorSet = new AnimatorSet();//组合动画 ObjectAnimator translationX = ObjectAnimator.ofFloat(tvPlayerNum, "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(tvPlayerNum, "translationY", yBegin, yEnd); animatorSet.setDuration(3000); animatorSet.setInterpolator(new DecelerateInterpolator()); animatorSet.play(translationX).with(translationY);//两个动画同时开始 animatorSet.start(); } else { int xBegin = (int) (Math.round((Math.abs(model.getPoints().get(0).x - proportionx) / fieldX * 100.0)) * width / 100 - viewWidth / 2); int yBegin = (int) (height - (Math.round(Math.abs(model.getPoints().get(0).y - proportiony) / fieldY * 100.0)) * height / 100 - viewHeight / 2); int xEnd = (int) ((Math.round(Math.abs(model.getPoints().get(2).x - proportionx) / fieldX * 100.0)) * width / 100 - viewWidth / 2); int yEnd = (int) (height - (Math.round(Math.abs(model.getPoints().get(2).y - proportiony) / fieldY * 100.0)) * height / 100 - viewHeight / 2); Log.i("info","正常-====xx"+Math.abs(model.getPoints().get(0).x - proportionx)+"y====="+Math.abs(model.getPoints().get(0).y - proportiony)); AnimatorSet animatorSet = new AnimatorSet();//组合动画 ObjectAnimator translationX = ObjectAnimator.ofFloat(tvPlayerNum, "translationX", xBegin, xEnd); ObjectAnimator translationY = ObjectAnimator.ofFloat(tvPlayerNum, "translationY", yBegin, yEnd); animatorSet.setDuration(3000); animatorSet.setInterpolator(new DecelerateInterpolator()); animatorSet.play(translationX).with(translationY);//两个动画同时开始 animatorSet.start(); } } } } private void bindingMinData(TextView tvPlayerNum, Data2DPlayerModel model) { if (model.isHomeTeam()) { tvPlayerNum.setBackgroundResource(R.drawable.ic_match2_mini_2d_blue); } else { tvPlayerNum.setBackgroundResource(R.drawable.ic_match2_mini_2d_red); } if (model.getTeamNum() < 10) { tvPlayerNum.setText(String.valueOf(model.getTeamNum())); } else { tvPlayerNum.setText(String.valueOf(model.getTeamNum())); } tvPlayerNum.setTag(model); tvPlayerNum.setLayerType(View.LAYER_TYPE_HARDWARE, null); } public void setHideName(boolean hideName) { this.hideName = hideName; for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); TextView tvName = (TextView) view.findViewById(R.id.tvName); tvName.setVisibility(hideName ? INVISIBLE : VISIBLE); } } public interface OnItemClickListener { void onItemClick(Data2DPlayerModel model); } }
仿球场直播球员跑动控件布局、
最新推荐文章于 2024-08-10 10:05:04 发布