Android中怎么实现一个折线走势图
创始人
2024-12-23 20:43:25
0次

//获取自定义属性private void obtainStyledAttrs(AttributeSet attrs) {  TypedArray typedArray = 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 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  super.onMeasure(widthMeasureSpec, heightMeasureSpec);  int width = MeasureSpec.getSize(widthMeasureSpec);  int height = measureHeight(heightMeasureSpec);  setMeasuredDimension(width,height); }//计算view需要的高度 private int measureHeight(int heightMeasureSpec) {  int result = 0;  int mode = MeasureSpec.getMode(heightMeasureSpec);  int size = MeasureSpec.getSize(heightMeasureSpec);  if(mode == MeasureSpec.EXACTLY){//如果给了具体值则直接用   result=size;  }else {  //否则高度等于字高与球直径的最大值   textHeight = (mPaint.descent()-mPaint.ascent());   float halfHeight = Math.max(textHeight, mPointMaxHeight) / 2;   result = (int) (halfHeight+mChartDistance);   //如果模式为AT_MOST即:测量高度不能超过父类给定的高度则取测量结果与size的最小值   if(mode==MeasureSpec.AT_MOST){    result = Math.min(result,size);   }  }  return result; } @Override protected void onDraw(Canvas canvas) {  super.onDraw(canvas);  if(!initMeasure()) return;  canvas.save();  //1先画两条主线  mPaint.setColor(mMainLineColor);  mPaint.setStrokeWidth(mainLineHeight);  //high Line  canvas.drawLine(textWidth+DEFAULT_OFFSETTING,mainLinePosition,w,mainLinePosition,mPaint);  //low Line  canvas.drawLine(textWidth+DEFAULT_OFFSETTING,mainLinePosition+mChartDistance,w,mainLinePosition+mChartDistance,mPaint);  //2再画文字  mPaint.setColor(mTextColor);  mPaint.setTextAlign(Paint.Align.LEFT);  Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();  RectF rt1=new RectF(0,mainLinePosition-textHeight/2,w,mainLinePosition+textHeight/2);  int baseline = (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 (int i=0;i=2){   mPaint.setColor(mChartLineColor);   mPaint.setStrokeWidth(chartLineWidth);   for (int i=0;imPointNum){   mainLineHeight=dp2px(3);  }else if(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));  /*小球直径应该由主线长度与小球数量决定*/  //理想直径  float ideaDia = mainLineWidth / (mPointNum + (mPointNum + 1));  //小球直径不能大于最大直径  if(ideaDia>mPointMaxHeight){//   Log.i("TTT","ideaDia>mPointMaxHeight");   pointHeight = mPointMaxHeight;   offsetX=(mainLineWidth-mPointNum*pointHeight)/(mPointNum+1);   //(极端情况)如果小球直径小于线高,为小球直径+2px  }else if(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;  return true; }//刷新小球集合 public void setPointList(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(); }

使用示例

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...