自定義view柱狀圖

記錄一個簡單的柱狀圖view,很簡陋,數(shù)據(jù)可自定義

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;

import com.chuangdu.kotlin.R;
import com.chuangdu.kotlin.entity.HistogramDataElement;
import com.chuangdu.kotlin.entity.HistogramDatas;

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

/**
 * Created by TU on 2019/8/26.
 * 柱狀圖
 */
public class CustHistogram extends View {
    private HistogramDatas histogramDatas;
    private String[] x_Group = {"1", "2", "3", "4", "5"};//x軸
    private String[] y_Group = {"10", "20", "30", "40", "50"};//y軸
    int[] BarHeight = {100, 200, 300, 400, 500};//相對的柱狀高度
    public final static int[] platterTable = new int[]{R.color.colorAccent};
    private Paint myPaint;
    private int width;
    private int height;

    public CustHistogram(Context context) {
        super(context);
    }

    public CustHistogram(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustHistogram(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        WindowManager wm = (WindowManager) this.getContext().getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        width = dm.widthPixels;
        height = dm.heightPixels - 760;
        Log.e("", width + "+ width");
        Log.e("height = ", height + "");
        //畫背景
        myPaint = new Paint();
        myPaint.setStrokeWidth(2);
        myPaint.setColor(Color.WHITE);
        myPaint.setStrokeWidth(0);
    }

    public void setHistogramDatas(HistogramDatas histogramDatas) {
        this.histogramDatas = histogramDatas;
    }

    @Override
    public void draw(Canvas canvas) {
        int xOffset = (int) (width * 0.1);
        int yOffset = (int) (height * 0.1);

        myPaint.setColor(getResources().getColor(R.color.colorAccent));
        myPaint.setStrokeWidth(2);

        if (histogramDatas == null) {
            getMockUphistogramDatas();
        }
        int xPadding = 10;
        if (histogramDatas != null) {
            //添加柱狀圖數(shù)據(jù)
            int count = histogramDatas.getHistogramCount();
            int xUnit = (width - 2 - xOffset) / count;
            myPaint.setTextSize(40);
            String[] histogramDatasNames = histogramDatas.getHistogramKeys();
            for (int i = 0; i < x_Group.length; i++) {
                Log.e("星星數(shù)量", x_Group[i]);
                List<HistogramDataElement> itemList = histogramDatas.getItems(histogramDatasNames[i]);
                int barWidth = (int) ((xUnit / Math.pow(itemList.size(), 2))) / 2;
                int startPos = xOffset - 30 + xPadding + xUnit * i;
                canvas.drawText(x_Group[i], startPos - barWidth / 3 + barWidth / 4, (height - yOffset) / 2 + 180, myPaint);
            }

            // Y Axis markers
            float min = 0, max = 0;
            for (int i = 0; i < histogramDatasNames.length; i++) {
                List<HistogramDataElement> itemList = histogramDatas.getItems(histogramDatasNames[i]);
                if (itemList != null && itemList.size() > 0) {
                    for (HistogramDataElement item : itemList) {
                        if (item.getValue() > max) {
                            max = item.getValue();
                        }
                        if (item.getValue() < min) {
                            min = item.getValue();
                        }
                    }
                }
            }
            //X軸
            myPaint.setColor(getResources().getColor(R.color.colorPrimary));
            canvas.drawLine(0, (height - yOffset) / 2 + 130, width, (height - yOffset) / 2 + 130, myPaint);//xOffset+barWid
            myPaint.setColor(getResources().getColor(R.color.colorAccent));

            myPaint.setStyle(Paint.Style.FILL);
            myPaint.setStrokeWidth(0);
            int maxItem = 0;
            for (int i = 0; i < histogramDatasNames.length; i++) {
                List<HistogramDataElement> itemList = histogramDatas.getItems(histogramDatasNames[i]);
                int barWidth = (int) ((xUnit / Math.pow(itemList.size(), 2))) / 2;
                int startPos = xOffset - 30 + xPadding + xUnit * i;
                int index = 0;
                int interval = barWidth / 2;
                if (itemList.size() > maxItem) {
                    maxItem = itemList.size();
                }
                int barHeight = BarHeight[i];
                myPaint.setColor(getResources().getColor(R.color.colorPrimaryDark));
                myPaint.setTextSize(40);
                canvas.drawText(y_Group[i], startPos + barWidth * index + interval * index - barWidth / 3 + barWidth / 4, (height - yOffset - barHeight) / 2 + 125, myPaint);
                myPaint.setColor(getResources().getColor(R.color.colorPrimary));
                canvas.drawRect(startPos + barWidth * index + interval * index - barWidth / 4, (height + 65 - yOffset - barHeight) / 2 + 100, startPos + barWidth * index + interval * index + barWidth - barWidth / 4, (height + 65 - yOffset) / 2 + 100, myPaint);
                index++;
            }

        }
        super.draw(canvas);
    }

   /**
     * 模擬數(shù)據(jù)
     */
    public void getMockUphistogramDatas() {
        histogramDatas = new HistogramDatas();
        for (int i = 1; i <= 5; i++) {
            List<HistogramDataElement> itemListOne = new ArrayList<>();
            itemListOne.add(new HistogramDataElement("", i * 10.0f, platterTable[0]));
            histogramDatas.addSeries(i , itemListOne);
        }
    }
}

代碼直接cv就可以運(yùn)行,測試數(shù)據(jù)已經(jīng)寫好了,基本的實(shí)體類就不貼了,根據(jù)自己需求擴(kuò)展吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • privateArrayListlist=newArrayList<>(); privateContextcont...
    Runtime123閱讀 1,532評論 2 1
  • 介紹 objc.io objc.io 是關(guān)于 Objective-C 最佳實(shí)踐和先進(jìn)技術(shù)的期刊,歡迎來到第一期! ...
    評評分分閱讀 1,820評論 5 24
  • 昨天晚上睡了一個美美的覺,臨睡前還是看安東尼睡著的,看著他的文字覺得心里很安靜,心里腦補(bǔ)電影里演員劉暢的一舉一動,...
    蘇小可閱讀 396評論 0 0
  • 立秋的那天 好想擁有一片楓樹林 將緩緩飄落在我掌心的楓葉 放在你的書籍里 可細(xì)細(xì)想來 金碧輝煌的宮殿 不及有你的燈...
    墨漁小橙橙閱讀 762評論 7 12
  • 一個人在笑時最好看,不僅僅因?yàn)檫@個人是你喜歡的人。 喜歡你哈哈大笑的樣子,全世界都跟你沒心沒肺。喜歡你捂著嘴偷笑的...
    吃肉的紅燒肉閱讀 3,367評論 2 1

友情鏈接更多精彩內(nèi)容