您的位置:首页 > 移动开发 > Android开发

【Android】自定义View -- 条形图(柱状图)

2016-02-22 21:21 639 查看
【问题】

实现可动态变化的条形图;
【效果图】









【用法】

Howtouse1?

<!--xml-->

<com.lyloou.view.HistogramView
android:id="@+id/dcv_7"
android:layout_margin="16dp"
android:padding="16dp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>


<!--Activity-->

HistogramViewdcv7=(HistogramView)view.findViewById(R.id.dcv_7);
ArrayList<Bar>bar7Lists=newArrayList<Bar>();
Barbar1=dcv7.newBar(1,0.3f,Color.parseColor("#b6bcc8"),"one","30");
Barbar2=dcv7.newBar(2,0.65f,Color.parseColor("#ff2d65"),"two","65");
Barbar3=dcv7.newBar(3,0.8f,Color.parseColor("#59bbfa"),"three","80");
bar7Lists.add(bar1);
bar7Lists.add(bar2);
bar7Lists.add(bar3);
dcv7.setBarLists(bar7Lists);


Howtouse2?

<!--xml-->

<com.lyloou.view.HistogramView
android:id="@+id/histogram_view"
android:layout_margin="16dp"
android:paddingLeft="16dp"
android:paddingRight="32dp"
android:paddingTop="15dp"
android:paddingBottom="33dp"
android:layout_width="match_parent"
android:layout_height="400dp"/>


<!--Activity-->

HistogramViewhistogram=(HistogramView)findViewById(R.id.histogram_view);
ArrayList<Bar>barLists=newArrayList<Bar>();
for(inti=0;i<15;i++){
floatratio=(float)Math.random();
intcolor=(int)(Color.GRAY*ratio);
Barbar=histogram.newBar(i,ratio,color,"","");
barLists.add(bar);
}
histogram.setBarLists(barLists);

【代码】
importjava.util.ArrayList;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Paint.FontMetricsInt;
importandroid.graphics.Rect;
importandroid.util.AttributeSet;
importandroid.util.DisplayMetrics;
importandroid.view.Display;
importandroid.view.View;
importandroid.view.WindowManager;
/**
*
*@authorLyloou
*/
publicclassHistogramViewextendsView{
privatePaintmPaint;
privateRectmRect;
privateintmWidth;
privateintmHeight;
privateintmPaddingStart;
privateintmPaddingEnd;
privateintmPaddingTop;
privateintmPaddingBottom;
privateintmLeft;
privateintmTop;
privateintmRight;
privateintmBottom;
privateContextmContext;
privateArrayList<Bar>mBarLists;
publicHistogramView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
mContext=context;
initData();
}
publicHistogramView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicHistogramView(Contextcontext){
this(context,null);
}
privatevoidinitData(){
mPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mRect=newRect();
//defaultdata
mBarLists=newArrayList<Bar>();
Barbar1=newBar(1,0.3f,Color.CYAN,"one","30");
Barbar2=newBar(2,0.55f,Color.GREEN,"two","55");
Barbar3=newBar(3,0.8f,Color.BLUE,"three","80");
mBarLists.add(bar1);
mBarLists.add(bar2);
mBarLists.add(bar3);
}
publicvoidsetBarLists(ArrayList<Bar>barLists){
mBarLists=barLists;
postInvalidate();
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
mWidth=getSizeFromMeasureSpec(widthMeasureSpec,480);
mHeight=getSizeFromMeasureSpec(heightMeasureSpec,480);
mPaddingStart=getPaddingStart();
mPaddingEnd=getPaddingEnd();
mPaddingTop=getPaddingTop();
mPaddingBottom=getPaddingBottom();
mLeft=mPaddingStart;
mTop=mPaddingTop;
mRight=mWidth-mPaddingEnd;
mBottom=mHeight-mPaddingBottom;
setMeasuredDimension(mWidth,mHeight);
}
@Override
protectedvoidonDraw(Canvascanvas){
//setbackground
canvas.drawColor(Color.RED);
mRect.set(mLeft,mTop,mRight,mBottom);
mPaint.setColor(Color.YELLOW);
canvas.drawRect(mRect,mPaint);
//*/
//设置底部文字属性
mPaint.setTextSize(sp2Px(mContext,11));
mPaint.setTextAlign(Paint.Align.CENTER);
FontMetricsIntfontMetricsInt=mPaint.getFontMetricsInt();
intfontHeight=(int)Math.ceil(fontMetricsInt.bottom-fontMetricsInt.top);
intN=mBarLists.size();
intUNIT_WIDTH=(mRight-mLeft)/(2*N+1);
intleft=0;
inttop=0;
intright=0;
intbottom=0;
//逐个画bar
for(inti=0;i<N;i++){
Barbar=mBarLists.get(i);
//画bar底部文字
left=(int)(mLeft+(i*2+0.5f)*UNIT_WIDTH);
right=left+UNIT_WIDTH*2;
top=mBottom-fontHeight;
bottom=mBottom;
mRect.set(left,top,right,bottom);
intbaseLine=(mRect.top+mRect.bottom-fontMetricsInt.top-fontMetricsInt.bottom)/2;
mPaint.setColor(Color.BLACK);
canvas.drawText(bar.bootomText,mRect.centerX(),baseLine,mPaint);
//画bar图形
left=mLeft+(i*2+1)*UNIT_WIDTH;
right=left+UNIT_WIDTH;
bottom=mBottom-fontHeight;
top=bottom-(int)((mBottom-mTop-fontHeight*2)*bar.ratio);
mRect.set(left,top,right,bottom);
mPaint.setColor(bar.color);
canvas.drawRect(mRect,mPaint);
//画bar顶部文字
left=(int)(mLeft+(i*2+0.5f)*UNIT_WIDTH);
right=left+UNIT_WIDTH*2;
bottom=top;
top=top-fontHeight;
mRect.set(left,top,right,bottom);
baseLine=(mRect.top+mRect.bottom-fontMetricsInt.top-fontMetricsInt.bottom)/2;
mPaint.setColor(Color.BLACK);
canvas.drawText(bar.topText,mRect.centerX(),baseLine,mPaint);
}
//画线
mPaint.setColor(Color.BLACK);
canvas.drawLine(mLeft,mBottom-fontHeight,mRight,mBottom-fontHeight,mPaint);
//canvas.drawLine(mLeft,mTop+fontHeight,mRight,mTop+fontHeight,mPaint);
super.onDraw(canvas);
}
publicclassBar{
publicintid;
publicfloatratio;
publicintcolor;
publicStringbootomText;
publicStringtopText;
publicBar(intid,floatratio,intcolor,StringbootomText,StringtopText){
this.id=id;
this.ratio=ratio;
this.color=color;
this.bootomText=bootomText;
this.topText=topText;
}
}
//工具类
publicstaticintgetSizeFromMeasureSpec(intmeasureSpec,intdefaultSize){
intresult=0;
intmode=MeasureSpec.getMode(measureSpec);
intsize=MeasureSpec.getSize(measureSpec);
if(mode==MeasureSpec.EXACTLY){
result=size;
}else{
result=defaultSize;
if(mode==MeasureSpec.AT_MOST){
result=Math.min(defaultSize,size);
}
}
returnresult;
}
publicstaticfloatsp2Px(Contextcontext,floatsp){
DisplayMetricsmetrics=newDisplayMetrics();
WindowManagerwm=(WindowManager)context
.getSystemService(Context.WINDOW_SERVICE);
Displaydisplay=wm.getDefaultDisplay();
display.getMetrics(metrics);
floatpx=metrics.scaledDensity;
returnsp*px;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: