3D的柱状图,接了个私活儿,需要一个柱状图需求很蛋疼,但是我仔细想了想,,其实也没有想象中的那么复杂。
我默默的沉默了1分钟,心里在想,老夫身怀程序员光环,搞不定妹子就算了,还搞不定你个柱状图!!!!!!
好吧,苦想2分钟后灵光一闪,开始动手:
上代码:
package com.example.helloword;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;
import android.widget.SeekBar;
public class ToonView extends View {
private Paint paint;
private Paint paint_2;
private Paint paintText;
private List<Integer> xlist;//x坐标标签
private List<Integer> ylist;//y坐标标签
private List<Integer> params;//参数集
private int paintColor=-1;
private boolean isDrawCheek=true;
public float XSpac=50;
public float YSpac=50;
public float rightXspac=50;
public float rightYspac=50;
private int textSize=20;
private int viewWidth=40;
private int sideWidth=10;
private Paint cheekPaint;
private Paint cheekPaint_2;
private Paint cheekPaint_3;
private List<List<String>> colors=new ArrayList<List<String>>();
public ToonView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initWedget();
}
public ToonView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initWedget();
}
public ToonView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
initWedget();
}
@Override
protected void onDraw(Canvas canvas) {
drawXY(canvas);//画X跟Y轴
drawHistogram(canvas);
super.onDraw(canvas);
}
private void drawHistogram(Canvas canvas) {//画柱状图
// TODO Auto-generated method stub
float Yoffset=((getHeight()-YSpac)/(ylist.size()));
float Xoffset=((getWidth()-XSpac)/(xlist.size()));
float rulerOffset=0;
if(xlist.size()<2)
throw new IllegalArgumentException("the params argument is <2");
else
rulerOffset=(xlist.get(1)-xlist.get(0));
for(int i=0;i<params.size();i++){
int randomColor=(int)(Math.random()*3);
List<String> clist=colors.get(randomColor);
paint.setColor(Color.parseColor(clist.get(1)));
cheekPaint_2.setColor(Color.parseColor(clist.get(0)));
cheekPaint_3.setColor(Color.parseColor(clist.get(2)));
int param=params.get(i);
float histigramHight=getHeight()-param*(Yoffset/rulerOffset);
canvas.drawLine(Xoffset*i+35+XSpac,getHeight()-YSpac,Xoffset*i+35+XSpac,histigramHight-YSpac, paint);
if(isDrawCheek){
// canvas.drawLine(Yoffset*i+10,getHeight()-5,Yoffset*i+10,histigramHight-15, cheekPaint);
// canvas.drawLine(Yoffset*i+60,getHeight()-5,Yoffset*i+60,histigramHight-15, cheekPaint);
// canvas.drawLine(Yoffset*i+10, histigramHight-15, Yoffset*i+60, histigramHight-15, cheekPaint);
canvas.drawLine(Xoffset*i+10+XSpac,getHeight()-YSpac,Xoffset*i+10+XSpac,histigramHight-YSpac, cheekPaint_2);
canvas.drawLine(Xoffset*i+60+XSpac,getHeight()-YSpac,Xoffset*i+60+XSpac,histigramHight-YSpac, cheekPaint_3);
}
resetPaint();
}
}
private void drawXY(Canvas canvas) {//画坐标
// TODO Auto-generated method stub
canvas.drawLine(XSpac,0,XSpac,getHeight()-YSpac, paint_2);//X
canvas.drawLine(XSpac,getHeight()-YSpac,getWidth(),getHeight()-YSpac, paint_2);//Y
canvas.drawLine(getWidth()-1,0,getWidth()-1,getHeight()-YSpac, paint_2);//X
float Xoffset=((getWidth()-XSpac)/(xlist.size()));
float Yoffset=((getHeight()-YSpac)/(ylist.size()));
for(int i=0;i<ylist.size();i++){//画X
// canvas.drawLine(5,Xoffset*i,10,Xoffset*i, paint_2);
canvas.drawLine(XSpac,Yoffset*i,getWidth(),Yoffset*i, paint_2);
}
for(int i=0;i<xlist.size();i++){//画Y
// canvas.drawLine(Yoffset*i,getHeight()-5,Yoffset*i,getHeight()-10, paint_2);
canvas.drawLine(Xoffset*i+XSpac,getHeight()-YSpac,Xoffset*i+XSpac,0, paint_2);
}
for(int i=0;i<ylist.size();i++){//画字
canvas.drawText(ylist.get(i)+"",0, getHeight()-Yoffset*i-YSpac, paintText);
}
for(int i=0;i<xlist.size();i++){
canvas.drawText(xlist.get(i)+"",XSpac+Xoffset*i,getHeight()-YSpac+textSize, paintText);
}
}
public void initViewData(List<Integer> xlist,List<Integer> ylist,List<Integer> params){
this.xlist=xlist;
this.ylist=ylist;
this.params=params;
}
private void initWedget() {
// TODO Auto-generated method stub
paint=new Paint();
paint.setColor(Color.parseColor("#1D6BB5"));
paint.setTypeface(Typeface.DEFAULT);
paint.setAntiAlias(true);
paint.setStrokeWidth(viewWidth);
paint_2=new Paint();
paint_2.setColor(Color.parseColor("#88999999"));
paint_2.setTypeface(Typeface.DEFAULT);
paint_2.setAntiAlias(true);
paint_2.setStrokeWidth(2);
cheekPaint=new Paint();
cheekPaint.setColor(Color.parseColor("#ff0000"));
cheekPaint.setTypeface(Typeface.DEFAULT);
cheekPaint.setAntiAlias(true);
cheekPaint.setStrokeWidth(1);
cheekPaint_2=new Paint();
cheekPaint_2.setColor(Color.parseColor("#4988C5"));
cheekPaint_2.setTypeface(Typeface.DEFAULT);
cheekPaint_2.setAntiAlias(true);
cheekPaint_2.setStrokeWidth(sideWidth);
cheekPaint_3=new Paint();
cheekPaint_3.setColor(Color.parseColor("#135595"));
cheekPaint_3.setTypeface(Typeface.DEFAULT);
cheekPaint_3.setAntiAlias(true);
cheekPaint_3.setStrokeWidth(sideWidth);
paintText=new Paint();
paintText.setColor(Color.parseColor("#ffffff"));
paintText.setTypeface(Typeface.DEFAULT);
paintText.setAntiAlias(true);
paintText.setStrokeWidth(2);
paintText.setTextSize(textSize);
initColors();
}
private void initColors() {
// TODO Auto-generated method stub
List<String> list1=new ArrayList<String>();
list1.add("#4988C5");
list1.add("#1D6BB5");
list1.add("#135595");
List<String> list2=new ArrayList<String>();
list2.add("#69A3CC");
list2.add("#3F8AB9");
list2.add("#325F7D");
List<String> list3=new ArrayList<String>();
list3.add("#AAE0F7");
list3.add("#7BD2F5");
list3.add("#64ABC9");
colors.add(list1);
colors.add(list2);
colors.add(list3);
}
private void resetPaint(){
paint.setColor(Color.parseColor("#1D6BB5"));
cheekPaint_2.setColor(Color.parseColor("#4988C5"));
cheekPaint_3.setColor(Color.parseColor("#135595"));
}
public void updataUI(){
invalidate();
}
}
好了
对外开放updataUI方法方便你们实时去更新这个柱状图,调用规则:
initViewData(......).updataUI();
去更新你的视图!
效果图如下: