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
淘汰赛->拓扑图
最新推荐文章于 2024-03-13 14:39:06 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)