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;i mPointNum){ 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(List list){ 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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。