淘汰赛->拓扑图

Android 自定义控件import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.gra...
摘要由CSDN通过智能技术生成
Android 自定义控件

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.bumptech.glide.Glide;
import com.up72.football.R;
import com.up72.football.manager.RouteManager;
import com.up72.football.model.LeagueIntegralModel;
import com.up72.football.utils.Constants;
import com.up72.football.utils.Utils;

import java.util.ArrayList;
import java.util.List;

import jp.wasabeef.glide.transformations.CropCircleTransformation;


/**
 * 淘汰赛->拓扑图
 * Created by CZF on 2017/3/17.
 */

public class LineView extends RelativeLayout {
    private Paint paint;
    private int length = 200;//线的长度
    private int initSpace = 150;//线的间距
    private int initX = 0;//开始X
    private int initY = initSpace;//开始Y
    private int count = 0;//个数
    private List<PointModel> points = new ArrayList<>();//存储线的开始和结束坐标
    private List<ImageModel> images = new ArrayList<>();//存储图片的开始和结束坐标
    private boolean isDraw = true;//是否绘制 xxx vs xxx View

    private float x1, x2, y1, y2;
    private List<List<LeagueIntegralModel>> lists;
    private int roundIndex = 0;//轮次游标
    private int numIndex = 0;//数量游标
    private boolean isLoadNull = true;// 是否加载 Null (问号)
    private int imgSize = Utils.dip2px(getContext(), 28);

    private List<LeagueIntegralModel> thirdList;
    private boolean isOpen16 = false;

    public LineView(Context context) {
        super(context);
        initPaint();
    }

    public LineView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    public LineView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (getChildCount() > 0) {
            measureChildren(widthMeasureSpec, heightMeasureSpec);
        }
    }

    private void initPaint() {
        paint = new Paint(); //设置一个笔刷大小是3的黄色的画笔
        paint.setColor(ContextCompat.getColor(getContext(), R.color.blue_500));
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeWidth(3);
    }

    public void setData(@NonNull List<List<LeagueIntegralModel>> lists) {
        this.lists = lists;
        count = (int) Math.pow(2, lists.size() - 1);
        if (count == 16 && isOpen16) {
            getLayoutParams().height = Utils.dip2px(getContext(), 500);
            invalidate();
        }
    }

    public void setThirdData(@NonNull List<LeagueIntegralModel> thirdList) {
        this.thirdList = thirdList;
    }


    public void setDraw(boolean draw) {
        isDraw = draw;
    }

    @Override
    protected void onDraw(final Canvas canvas) {
        super.onDraw(canvas);
        points.clear();
        images.clear();
        double n = 0;
        while (Math.pow(2, n) < count) {
            n++;
        }
        int count = (int) Math.pow(2, n);
        if (count != 2 && count != 4 && count != 8 && count < 32 && isOpen16) {
            getLayoutParams().height = Utils.dip2px(getContext(), 500);

            int tier = (int) (n + 1); //从左往右 N -1 才是真实的层次,这里+1为了留出间距
            int maxNum = count / 2 + 1;//从上往下 N个 不+1 才是真实的个数 这里为了留出间距
            initSpace = getHeight() / maxNum;
            initX = 300;
            initY = initSpace;
            length = (getWidth() - initX) / tier;
            roundIndex = 0;//轮次游标
            numIndex = 0;//数量游标
            if (isDraw) {
                isDraw = false;
                removeAllViews();
                int width = 260;
                int height = 100;
                int x = 300 - width;
                int y = getHeight() / maxNum - height / 2;
                for (int i = 0; i < maxNum - 1; i++) {
                    ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(width, height);
                    View view = LayoutInflater.from(getContext()).inflate(R.layout.item_team_game, null);
                    view.setLayoutParams(params);
                    view.setX(x);
                    view.setY(y);
                    if (roundIndex < lists.size()) {
                        ImageView ivHomeAvatar = (ImageView) view.findViewById(R.id.ivHomeAvatar);
                        ImageView ivAwayAvatar = (ImageView) view.findViewById(R.id.ivAwayAvatar);

                        if (numIndex < lists.get(roundIndex).size()) {
                            final LeagueIntegralModel model = lists.get(roundIndex).get(numIndex);
                            if (!model.isBye()) {
                                if (model.getBitmap() == null) {
                                    ivHomeAvatar.setImageResource(R.drawable.ic_league_team);
                                } else {
                                    ivHomeAvatar.setImageBitmap(model.getBitmap());
                                }
                                Glide.with(getContext())
                                        .load(Constants.RequestUrl.baseImageUrl + model.getTeamImg())
                                        .error(R.drawable.ic_league_team)
                                        .placeholder(R.drawable.ic_league_team)
                                        .bitmapTransform(new CropCircleTransformation(getContext()))
                                        .dontAnimate().into(ivHomeAvatar);

                                ivHomeAvatar.setOnClickListener(new OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        Bundle bundle = new Bundle();
                                        bundle.putInt(Constants.TEAM_ID, model.getTeamId());
                                        RouteManager.getInstance().toTeamDetailsActivity(getContext(), bundle);
                                    }
                                });
                            } else {
                                ivHomeAvatar.setImageResource(R.drawable.ic_league_bye);
                            }
                        }
                        numIndex++;
                        if (numIndex < lists.get(roundIndex).size()) {
                            final LeagueIntegralModel model = lists.get(roundIndex).get(numIndex);
                            if (!model.isBye()) {
                                if (model.getBitmap() == null) {
                                    ivAwayAvatar.setImageResource(R.drawable.ic_league_team);
                                } else {
                                    ivAwayAvatar.setImageBitmap(model.getBitmap());
                                }
                                Glide.with(getContext())
                                        .load(Constants.RequestUrl.baseImageUrl + model.getTeamImg())
                                        .error(R.drawable.ic_league_team)
                                        .placeholder(R.drawable.ic_league_team)
                                        .bitmapTransform(new CropCircleTransformation(getContext()))
                                        .dontAnimate().into(ivAwayAvatar);

                                ivAwayAvatar.setOnClickListener(new OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        Bundle bundle = new Bundle();
                                        bundle.putInt(Constants.TEAM_ID, model.getTeamId());
                                        RouteManager.getInstance().toTeamDetailsActivity(getContext(), bundle);
                                    }
                                });
                            } else {
                                ivAwayAvatar.setImageResource(R.drawable.ic_league_bye);
                            }
                        }
                        numIndex++;
                    }
                    addView(view);
                    y += getHeight() / maxNum;

                }
                numIndex = 0;
            }

            roundIndex = 1;
            while (count >= 1) {
                count /= 2;
                int x = initX;
                int y = initY;
                for (int i = 0; i < count; i++) {
                    if (count == 1) {
                        canvas.drawLine(x, y, x + length / 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值