Android实现折线走势图
本文实例为大家分享了Android折线走势图的具体代码,供大家参考,具体内容如下
先来看看效果图
可以根据球的数量动态的改变自己的球半径,以及线宽
代码实现也是超级简单
//获取自定义属性
privatevoidobtainStyledAttrs(AttributeSetattrs){
TypedArraytypedArray=getContext().obtainStyledAttributes(attrs,R.styleable.High_LowChartView);
mTextSize=(int)typedArray.getDimension(R.styleable.High_LowChartView_hl_chart_textsize,mTextSize);
mTextColor=typedArray.getColor(R.styleable.High_LowChartView_hl_chart_textcolor,mTextColor);
if(typedArray.getString(R.styleable.High_LowChartView_hl_hchart_text)!=null){
mHighText=typedArray.getString(R.styleable.High_LowChartView_hl_hchart_text);
}
if(typedArray.getString(R.styleable.High_LowChartView_hl_hchart_text)!=null){
mLowText=typedArray.getString(R.styleable.High_LowChartView_hl_hchart_text);
}
mHighPointColor=typedArray.getColor(R.styleable.High_LowChartView_hl_chart_high_pointcolor,mHighPointColor);
mLowPointColor=typedArray.getColor(R.styleable.High_LowChartView_hl_chart_low_pointcolor,mLowPointColor);
mMainLineColor=typedArray.getColor(R.styleable.High_LowChartView_hl_chart_mianlinecolor,mMainLineColor);
mChartLineColor=typedArray.getColor(R.styleable.High_LowChartView_hl_chart_chartlinecolor,mChartLineColor);
mChartDistance=(int)typedArray.getDimension(R.styleable.High_LowChartView_hl_chart_distance,mChartDistance);
init();
typedArray.recycle();
}
//重写onMeasure
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
intwidth=MeasureSpec.getSize(widthMeasureSpec);
intheight=measureHeight(heightMeasureSpec);
setMeasuredDimension(width,height);
}
//计算view需要的高度
privateintmeasureHeight(intheightMeasureSpec){
intresult=0;
intmode=MeasureSpec.getMode(heightMeasureSpec);
intsize=MeasureSpec.getSize(heightMeasureSpec);
if(mode==MeasureSpec.EXACTLY){//如果给了具体值则直接用
result=size;
}else{
//否则高度等于字高与球直径的最大值
textHeight=(mPaint.descent()-mPaint.ascent());
floathalfHeight=Math.max(textHeight,mPointMaxHeight)/2;
result=(int)(halfHeight+mChartDistance);
//如果模式为AT_MOST即:测量高度不能超过父类给定的高度则取测量结果与size的最小值
if(mode==MeasureSpec.AT_MOST){
result=Math.min(result,size);
}
}
returnresult;
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
if(!initMeasure())return;
canvas.save();
//1先画两条主线
mPaint.setColor(mMainLineColor);
mPaint.setStrokeWidth(mainLineHeight);
//highLine
canvas.drawLine(textWidth+DEFAULT_OFFSETTING,mainLinePosition,w,mainLinePosition,mPaint);
//lowLine
canvas.drawLine(textWidth+DEFAULT_OFFSETTING,mainLinePosition+mChartDistance,w,mainLinePosition+mChartDistance,mPaint);
//2再画文字
mPaint.setColor(mTextColor);
mPaint.setTextAlign(Paint.Align.LEFT);
Paint.FontMetricsIntfontMetrics=mPaint.getFontMetricsInt();
RectFrt1=newRectF(0,mainLinePosition-textHeight/2,w,mainLinePosition+textHeight/2);
intbaseline=(int)((rt1.bottom+rt1.top-fontMetrics.bottom-fontMetrics.top)/2);
canvas.drawText(mHighText,0,baseline,mPaint);
canvas.drawText(mLowText,0,baseline+mChartDistance,mPaint);
//3初始化小球圆心
canvas.translate(textWidth+DEFAULT_OFFSETTING,0);
for(inti=0;i=2){
mPaint.setColor(mChartLineColor);
mPaint.setStrokeWidth(chartLineWidth);
for(inti=0;imPointNum){
mainLineHeight=dp2px(3);
}elseif(10<=mPointNum&&20>mPointNum){
mainLineHeight=dp2px(2);
}else{
mainLineHeight=dp2px(1);
}
//主线长度等于总宽度-(文字宽度+30px)
textWidth=Math.max(mPaint.measureText(mHighText),mPaint.measureText(mLowText));
mainLineWidth=(int)(w-(textWidth+DEFAULT_OFFSETTING));
/*小球直径应该由主线长度与小球数量决定*/
//理想直径
floatideaDia=mainLineWidth/(mPointNum+(mPointNum+1));
//小球直径不能大于最大直径
if(ideaDia>mPointMaxHeight){
//Log.i("TTT","ideaDia>mPointMaxHeight");
pointHeight=mPointMaxHeight;
offsetX=(mainLineWidth-mPointNum*pointHeight)/(mPointNum+1);
//(极端情况)如果小球直径小于线高,为小球直径+2px
}elseif(ideaDia<=mainLineHeight){
//Log.i("TTT","ideaDia<=mPointMaxHeight");
pointHeight=mainLineHeight+2;
offsetX=(mainLineWidth-mPointNum*pointHeight)/(mPointNum+1);
}else{
//Log.i("TTT","pointHeight=offsetX=ideaDia");
pointHeight=offsetX=ideaDia;
}
//主线位置
mainLinePosition=(h-mChartDistance)/2;
//折线宽度
chartLineWidth=mainLineHeight/2;
returntrue;
}
//刷新小球集合
publicvoidsetPointList(Listlist){
if(list==null&&list.size()==0)return;
mList.clear();
if(list.size()>150){
mList.addAll(list.subList(0,150));
}else{
mList.addAll(list);
}
invalidate();
}
使用示例
好了这样折线图就绘制完成了,是不是很简单呢?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。