android 单柱图表绘制

此篇文章主要是介绍绘制单柱图表 后边还会介绍绘制双柱和圆形图表 大家可根据自己的需求更改相应代码以达到要求
效果图


image.png

数据类

public class ChartValue {
   protected int value;
   protected float tempValueY;
   protected int barColor;
   protected int valueColor;
   protected String xAxisLable;

   public ChartValue(int value, int barColor, String xAxisLable) {
       this.value = value;
       this.barColor = barColor;
       this.valueColor=barColor;
       this.xAxisLable = xAxisLable;
   }

   public int getValueColor() {
       return valueColor;
   }

   public void setValueColor(int valueColor) {
       this.valueColor = valueColor;
   }

   /*public String getShowValue(){
       return value+"";
   }*/
   public float getTempValueY() {
       return tempValueY;
   }

   public void setTempValueY(float tempValueY) {
       this.tempValueY = tempValueY;
   }

   public int getValue() {
       return value;
   }

   public void setValue(int value) {
       this.value = value;
   }

   public int getBarColor() {
       return barColor;
   }

   public void setBarColor(int barColor) {
       this.barColor = barColor;
   }

   public String getxAxisLable() {
       return xAxisLable;
   }

   public void setxAxisLable(String xAxisLable) {
       this.xAxisLable = xAxisLable;
   }
}

将数据按要求显示 实现此类

public abstract class ShowValueFormat<T> {

   public abstract String valueFormat(T t);
}

图表绘制类

public class SingleBarChartView extends View {
   Context mCox;
   int yMaxValue=100;//y抽最大值
   float yIntervalSpace;//y抽横线间隔距离
   int yIntervalCount=5;//y抽间隔横线个数  不包含x抽

   int viewWidth,viewHeight;//view的宽度 高度
   int gridLineColor;//间隔线颜色
   int gridListStrokeSize;
   int xAxisStrokeSize;//x轴线的宽度
   int xAxisColor;//x抽线颜色
   int xAxisTextSize;//x抽字体大小
   int xAxisTextColor;//x抽字体颜色
   int valueTextSize;//值的字体大小
   int valueTextColor;//值的字体颜色
   int xAxisTextTopSpace;//x轴字体距离x抽线的距离
   int barWide;//bar的宽度
   int valueStrSpace;

   Paint mPaint;

   private ArrayList<ChartValue> mDatas=new ArrayList<>();
   ShowValueFormat showValueFormat;
   public SingleBarChartView(Context context) {
       super(context);
       init(context);
   }

   public SingleBarChartView(Context context, @Nullable AttributeSet attrs) {
       super(context, attrs);
       init(context);
   }

   public SingleBarChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
       super(context, attrs, defStyleAttr);
       init(context);
   }

   @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
   public SingleBarChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
       super(context, attrs, defStyleAttr, defStyleRes);
       init(context);

   }

   private void init(Context context){
       initValues();

       mCox=context;
       yMaxValue=100;//y抽最大值
//        yInterval;//y抽横线间隔距离
       yIntervalCount=5;//y抽间隔横线个数  不包含x抽
       gridListStrokeSize=1;
       xAxisStrokeSize=1;
       barWide=DensityUtils.sp2px(mCox,12);//value bar的宽度

       gridLineColor= 0xffff0000;//间隔线颜色 ContextCompat.getColor(mCox, R.color.common_divider_color)
       xAxisColor=gridLineColor;//x抽线颜色
       xAxisTextSize= DensityUtils.sp2px(mCox,10);//x抽字体大小
       xAxisTextColor=ContextCompat.getColor(mCox, R.color.font_accent);//x抽字体颜色
       valueTextSize=xAxisTextSize;//值的字体大小
       valueTextColor=0xff5D84EB;//值的字体颜色
       xAxisTextTopSpace=DensityUtils.dip2px(mCox,3);//x轴字体距离x抽线的距离
       valueStrSpace=DensityUtils.dip2px(mCox,3);
       mPaint=new Paint();

       post(new Runnable() {
           @Override
           public void run() {
               viewWidth=getWidth();
               viewHeight=getHeight();
               initAxisTextPaint(mPaint);
               float textHeight=mPaint.getFontMetrics().bottom-mPaint.getFontMetrics().top;
               yIntervalSpace=(viewHeight-textHeight-xAxisTextTopSpace)/yIntervalCount;
           }
       });
   }
   public void setShowValueFormat(ShowValueFormat showValueFormat) {
       this.showValueFormat = showValueFormat;
   }
   @Override
   protected void onDraw(Canvas canvas) {
       super.onDraw(canvas);
       if(mDatas.size()==0){
           return;
       }
       //水平方向的grid的线
       initGridLinePaint(mPaint);
       for(int i=0;i<yIntervalCount;i++){
           canvas.drawLine(0,i*yIntervalSpace,viewWidth,i*yIntervalSpace,mPaint);
       }
       //x轴
       initXAxisPaint(mPaint);
       canvas.drawLine(0,yIntervalCount*yIntervalSpace,viewWidth,yIntervalCount*yIntervalSpace,mPaint);
       if(mDatas.size()==0){
           return;
       }

       float xIntervalSpace=viewWidth/mDatas.size();
       float xAxisY=yIntervalCount*yIntervalSpace;//x轴的坐标y值
       boolean needDrawAgain=false;
       for(int i=0;i<mDatas.size();i++){
           //y轴方向的grid的线
           initGridLinePaint(mPaint);
           float x=i*xIntervalSpace+xIntervalSpace/2;
           canvas.drawLine(x,0,x,xAxisY,mPaint);

           ChartValue value=mDatas.get(i);
           //x轴的lable
           initAxisTextPaint(mPaint);
           canvas.drawText(value.getxAxisLable(),x,xAxisY-mPaint.getFontMetrics().top+xAxisTextTopSpace,mPaint);
           //bar
           initBarPaint(mPaint,value.getBarColor());
           float actualValueY=value.getValue()*yIntervalCount*yIntervalSpace/yMaxValue;
           if(value.getTempValueY()<actualValueY){
               value.setTempValueY(value.getTempValueY()+5);
               if(value.getTempValueY()>actualValueY){
                   value.setTempValueY(actualValueY);
               }
           }
           if(value.getTempValueY()<actualValueY){
               needDrawAgain=true;
           }
           float tempY=yIntervalCount*yIntervalSpace-value.getTempValueY();
           canvas.drawLine(x,xAxisY,x,tempY,mPaint);
           //值的文字
           initValueTextPaint(mPaint,value.getValueColor());
           canvas.drawText(getShowValue(value),x,tempY-valueStrSpace-mPaint.getFontMetrics().bottom,mPaint);
       }
       if(needDrawAgain){
           postInvalidateDelayed(10);
       }

   }
   private void initGridLinePaint(Paint paint){
       paint.reset();
       paint.setColor(gridLineColor);
       paint.setStrokeWidth(gridListStrokeSize);
       paint.setAntiAlias(true);
   }
   private void initXAxisPaint(Paint paint){
       paint.reset();
       paint.setColor(xAxisColor);
       paint.setStrokeWidth(xAxisStrokeSize);
       paint.setAntiAlias(true);
   }
   private void initAxisTextPaint(Paint paint){
       paint.reset();
       paint.setColor(xAxisTextColor);
       paint.setTextSize(xAxisTextSize);
       paint.setTextAlign(Paint.Align.CENTER);
       paint.setAntiAlias(true);
   }
   private void initBarPaint(Paint paint,int barColor){
       paint.reset();
       paint.setColor(barColor);
       paint.setStrokeWidth(barWide);
       paint.setAntiAlias(true);
   }
   private void initValueTextPaint(Paint paint,int valueTextColor){
       paint.reset();
       paint.setColor(valueTextColor);
       paint.setTextSize(valueTextSize);
       paint.setTextAlign(Paint.Align.CENTER);
       paint.setAntiAlias(true);
   }
   private void initValues(){
       mDatas.add(new ChartValue(80,0xff5C84EB,"25号"));
       mDatas.add(new ChartValue(66,0xffB4C9FF,"24号"));
       mDatas.add(new ChartValue(33,0xffB4C9FF,"23号"));
       mDatas.add(new ChartValue(78,0xffB4C9FF,"22号"));
       mDatas.add(new ChartValue(20,0xffB4C9FF,"21号"));
       mDatas.add(new ChartValue(44,0xffB4C9FF,"20号"));
       mDatas.add(new ChartValue(50,0xffB4C9FF,"19号"));
       setShowValueFormat(new ShowValueFormat<ChartValue>() {
           @Override
           public String valueFormat(ChartValue value) {
               return value.getValue()+"";
           }
       });
   }
   public String getShowValue(ChartValue value){
       if(showValueFormat==null){
           return value.getValue()+"";
       }
       return showValueFormat.valueFormat(value);
   }
}
红小.jpg

打开支付宝首页搜索“527896564” 立即领红包

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 前言: 在接触Android这么长时间,看到很多大牛都在和大家分享自己的知识,深有体会,刚好前段时间写了一个Dem...
    杨艳伟阅读 1,257评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 文章转载自:https://github.com/tuteng/MPAndroidCharthttps://git...
    no白菜阅读 5,132评论 0 8
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,580评论 1 114
  • 就是这样的雨天 我和你一起坐在廊前 看水芙蓉欣欣然俏立 塘中的锦鲤躲在荷叶下呼吸 执一盏清茗 叙两件小事 或许还有...
    春儿_5a02阅读 115评论 0 0