仿球场直播球员跑动控件布局、

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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值