android柱狀圖(自定義view)
阿新 • • 發佈:2018-11-09
public class HistogramView extends View { private Paint mLinePaint; private Paint mGreenPaint; private Paint mTextPaint; private Context mContext; private float weight; private float height; private float mScale; private String[] y_title = {"100", "80", "60", "40", "20", "0"}; private List<Long> mData; private List<String> mNames; public HistogramView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mContext = context; mLinePaint = new Paint(); mGreenPaint = new Paint(); mTextPaint = new Paint(); mLinePaint.setARGB(255, 223, 233, 231); mGreenPaint.setARGB(255, 0, 200, 149); mTextPaint.setARGB(255, 153, 153, 153); mGreenPaint.setStyle(Paint.Style.FILL); mTextPaint.setAntiAlias(true); mGreenPaint.setAntiAlias(true); mLinePaint.setAntiAlias(true); mScale = context.getResources().getDisplayMetrics().density; mData = new ArrayList<>(); mNames = new ArrayList<>(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); weight = 0.7F * w; height = 0.70F * h; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float min_height = height / 5; for (int i = 5; i >= 0; i--) { if (i == 5) { mLinePaint.setARGB(255, 131, 148, 144); } else { mLinePaint.setARGB(255, 223, 233, 231); } canvas.drawLine(70 * mScale, 30 * mScale + min_height * i, 70 * mScale + weight, 30 * mScale + min_height * i, mLinePaint); mTextPaint.setTextAlign(Paint.Align.RIGHT); mTextPaint.setTextSize(10 * mScale); canvas.drawText(y_title[i], 60 * mScale, 32 * mScale + min_height * i, mTextPaint); } float min_weight = (weight - 70 * mScale) / (mData.size()); mTextPaint.setTextSize(12 * mScale); mTextPaint.setTextAlign(Paint.Align.CENTER); for (int i = 0; i < mData.size(); i++) { int leftR = (int) (70 * mScale + i * min_weight + min_weight / 2); int rightR = leftR + (int) (min_weight / 2); int buttomR = (int) (30 * mScale + min_height * 5); int topR = buttomR - (int) (height / 100 * mData.get(i)); canvas.drawRect(new RectF(leftR, topR, rightR, buttomR), mGreenPaint); mTextPaint.setARGB(255, 153, 153, 153); canvas.drawText(mNames.get(i), leftR + min_weight / 4, buttomR + 20 * mScale, mTextPaint); mTextPaint.setARGB(255, 51, 51, 51); canvas.drawText(mData.get(i) + "", leftR + min_weight / 4, topR - 10 * mScale, mTextPaint); } } public void updateThisData(List<Long> data, List<String> name) { mData = data; mNames = name; invalidate(); } }