3D柱状图


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();
去更新你的视图!

效果图如下:


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值