/* * Copyright (c) 2014. Marshal Chen. */ package com.marshalchen.common.uimodule.triangle; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.Paint.Style; import android.graphics.RectF; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver.OnPreDrawListener; import com.marshalchen.ultimateandroiduicomponent.R; /** * 人形三角形 * * * */ public class TriangleView extends View { Bitmap bitmap, defaults, raiseYourhand, toLetGo; // 默认,举手,放手 Paint paint, paint_text; RectF rectF; float dp; float widthCentre; float heightCentre; int gender; int ratio; int than; int tag[]; final int lenght = 6;//控制行数 大于0 /** * * @param context * @param gender * 性别 0代表女 1代表男 * @param than * 百分比 */ public TriangleView(Context context, int gender, int than) { super(context); tag = get(lenght); this.gender = gender; ratio = than; this.than = (int) ((100.0f - than) / (100.0f / tag[lenght - 1])); setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); this.getViewTreeObserver().addOnPreDrawListener( new OnPreDrawListener() { public boolean onPreDraw() { init(); getViewTreeObserver().removeOnPreDrawListener(this); return false; } }); } public void init() { dp = getResources().getDimension(R.dimen.triangle_dp); paint = new Paint(); paint_text = new Paint(); paint_text.setAntiAlias(true); paint_text.setColor(0xffffffff); paint_text.setTextSize(dp * 1.5f); paint_text.setStrokeWidth(dp * 0.15f); paint_text.setTextAlign(Align.CENTER); paint_text.setStyle(Style.FILL); rectF = new RectF(); widthCentre = getWidth() / 2; heightCentre = getHeight() / 3; if (gender == 0) { defaults = BitmapFactory.decodeResource(getResources(), R.drawable.triangle_woman_default); raiseYourhand = BitmapFactory.decodeResource(getResources(), R.drawable.triangle_woman_for); toLetGo = BitmapFactory.decodeResource(getResources(), R.drawable.triangle_woman_relinquish); } else { defaults = BitmapFactory.decodeResource(getResources(), R.drawable.triangle_man_default); raiseYourhand = BitmapFactory.decodeResource(getResources(), R.drawable.triangle_man_for); toLetGo = BitmapFactory.decodeResource(getResources(), R.drawable.triangle_man_relinquish); } } public int[] get(int lenght) { // 根据三角形规律得到每行最后一个图标的数字, int[] tag = new int[lenght]; tag[0] = 0; for (int i = 1; i < tag.length; i++) { tag[i] = tag[i - 1] + i;// 规律为后面的数减去前面的数字可以得到 1.2.3... } return tag; } protected void onDraw(Canvas c) { super.onDraw(c); drawTriangle(c); } public void drawTriangle(Canvas c) { c.drawText("你超过了全国 " + ratio + "%的人", getWidth() / 2, dp * 2.5f, paint_text); float bmpsize = dp * 1.7f; // 图片大小 heightCentre = getHeight() / 5; // 初始y位置 widthCentre = getWidth() / 2 + bmpsize;// 初始x位置 float x = 0; float y = 0; float offsetX = dp * 3.5f; // x 偏移量 float offsetY = dp * 3.5f;// y 偏移量 for (int i = 0; i < tag[lenght-1]; i++) { for (int j = 0; j < tag.length; j++) { if (i == tag[j]) { y = j * offsetY;// 重置y x = x - (j * offsetX + offsetX / 2);// 重置x break; } } rectF.set(widthCentre - bmpsize + x, heightCentre - bmpsize + y, widthCentre + bmpsize + x, heightCentre + bmpsize + y); if (i < than) { bitmap = defaults; } if (i == than) { bitmap = raiseYourhand; } if (i > than) { bitmap = toLetGo; } c.drawBitmap(bitmap, null, rectF, paint); x += offsetX; } } }