android 网络测速 绘图类

package com.android.settings.c10.nettest;

import java.math.BigDecimal;

import com.android.settings.R;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class C50NetSpeedChart extends View {
 private final static String TAG = "C50NetSpeedChart";

 public C50NetSpeedChart(Context context) {
  super(context);
  init();
 }

 public C50NetSpeedChart(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init();
 }

 public C50NetSpeedChart(Context context, AttributeSet attrs) {
  super(context, attrs);
  setXCoordinatesText(new String[] { "","","","","10s", "","","","","20s", "","","","","30s", "",
    "","","","40s", "","","","", "50s", "","","","", "60s" });
  setYCoordinatesText(new String[] {
    context.getString(R.string.c50_net_speed_0m),
    context.getString(R.string.c50_net_speed_2m),
    context.getString(R.string.c50_net_speed_4m),
    context.getString(R.string.c50_net_speed_8m),
    context.getString(R.string.c50_net_speed_20m),
    context.getString(R.string.c50_net_speed_50m),
    context.getString(R.string.c50_net_speed_100m) });
  init();

  // Datas[0] = 6.4f;
  // Datas[1] = 8;
  // Datas[2] = 4;
  // Datas[3] = 60;
  // Datas[4] = 20;
  // Datas[5] = 50;
  // Datas[6] = 2;
  // Datas[7] = 50;

 }

 private void init() {
  for (int i = 0; i < Datas.length; i++) {
   Datas[i] = -100000;
  }
 }

 float[] xCoordinates;
 String[] xCoordinatesText;
 String[] yCoordinatesText;
 float[] Datas = null;
 private float prevX, prevY;// 保存上一个点的位置,用于画线
 int ySetup = 10;// Y轴的步长值

 public void reset() {
  init();
  postInvalidate();
 }

 /**
  * 添加坐标值
  *
  * @param y
  */
 public void addY(float y) {
  Log.d(TAG, "addY-->y:" + y);

  if (Datas == null && this.xCoordinatesText != null)
   Datas = new float[this.xCoordinatesText.length];

  if (y >= 0) {
   boolean isHave = false;
   for (int i = 0; i < Datas.length; i++) {
    if (Datas[i] == -100000) {
     Datas[i] = y;
     isHave = true;
     break;
    }
   }
   if (!isHave) {
    init();
    Datas[0] = y;
   }
  }
  this.postInvalidate();
 }

 public int getPointCount() {
  int pointCount = 0;// 记录画了多少个点

  for (int i = 0; i < Datas.length; i++) {
   if (Datas[i] == -1)
    Datas[i] = 0;
   else if (Datas[i] < -1)
    continue;
   pointCount++;
  }
  return pointCount;

 }

 public float getAvg() {
  float total = 0.0f;
  int pointCount = 0;// 记录画了多少个点
  for (int i = 0; i < Datas.length; i++) {
   if (Datas[i] == -1)
    Datas[i] = 0;
   else if (Datas[i] < -1)
    continue;
   total += Datas[i];
   pointCount++;
  }
  return new BigDecimal(total / pointCount).setScale(2,
    BigDecimal.ROUND_HALF_UP).floatValue();

 }

 /**
  * 设置X坐标的文本
  *
  * @param xCoordinatesText
  */
 public void setXCoordinatesText(String[] xCoordinatesText) {
  this.xCoordinatesText = xCoordinatesText;
  
  if (Datas == null && this.xCoordinatesText != null)
   Datas = new float[this.xCoordinatesText.length];
 }

 /**
  * 设置Y坐标的文本
  *
  * @param yCoordinatesText
  */
 public void setYCoordinatesText(String[] yCoordinatesText) {
  this.yCoordinatesText = yCoordinatesText;
 }

 @Override
 public void onDraw(Canvas canvas) {
  Log.d(TAG, "onDraw");
  if (this.xCoordinatesText == null || this.xCoordinatesText.length == 0)
   return;

  if (this.yCoordinatesText == null || this.yCoordinatesText.length == 0)
   return;

  if (Datas == null && this.xCoordinatesText != null)
   Datas = new float[this.xCoordinatesText.length];

  xCoordinates = new float[this.xCoordinatesText.length];

  // 画布背景为透明色
  canvas.drawColor(Color.TRANSPARENT);

  int w = 620;
  int h = 500;

  {
   // 创建画笔
   Paint p = new Paint();
   p.setAntiAlias(true);
   p.setStrokeWidth(1);
   p.setColor(Color.argb(170, 170, 170, 170));
   p.setStyle(Paint.Style.STROKE);// 设置空心

   Paint pRed = new Paint();
   pRed.setAntiAlias(true);
   pRed.setStrokeWidth(1);
   pRed.setColor(Color.argb(255, 255, 255, 255));

   // 数据线画笔
   Paint pDataLine = new Paint(Paint.DITHER_FLAG);
   pDataLine.setStrokeWidth(3);// 线条宽度pDataLine
   pDataLine.setStyle(Paint.Style.STROKE);// 设置空心
   pDataLine.setStrokeJoin(Paint.Join.ROUND);// 设置结合处的样子,Miter:结合处为锐角,Round:结合处为圆弧:BEVEL:结合处为直线。
   pDataLine.setStrokeCap(Paint.Cap.ROUND);// 保证线与线之间圆滑
   pDataLine.setAntiAlias(true);
   pDataLine.setColor(Color.argb(255, 255, 255, 255));

   // X,Y坐标上的文字画笔
   Paint pXyText = new Paint();
   pXyText.setAntiAlias(true);
   pXyText.setTextSize(20);
   pXyText.setColor(Color.argb(255, 255, 255, 255));

   // 数据数字文本画笔
   Paint p_data_text = new Paint();
   p_data_text.setAntiAlias(true);
   p_data_text.setTextSize(30);
   p_data_text.setColor(Color.argb(255, 190, 29, 16));

   int padding_left = 120;// 实际的表格与画布之间的间隙
   int padding_top = 80;
   int padding_right = 50;
   int padding_bottom = 90;

   // 找到图表的原点
   int x = padding_left;
   int y = h - padding_bottom;

   // 画X轴
   {
    canvas.drawLine(x, y, w - padding_right, y, p);
    p.setTextSize(20);
    for (int i = 1; i <= xCoordinatesText.length; i++) {
     xCoordinates[i - 1] = x
       + i
       * ((float) (w - x - padding_right) / xCoordinatesText.length);
     canvas.drawText(xCoordinatesText[i - 1],
       xCoordinates[i - 1] - 15, y + padding_bottom / 2
         - 5, pXyText);// 画文本

     if (i != (xCoordinatesText.length+1) && i % 5 == 0)
      canvas.drawLine(xCoordinates[i - 1], y,
        xCoordinates[i - 1], /* padding_top */
        padding_top, p);// 画小线

    }

   }

   // 画Y轴
   float[] yCoordinates = new float[yCoordinatesText.length];
   {
    canvas.drawLine(x, y, x, padding_top, p);
    p.setTextSize(20);
    for (int i = 0; i <= (yCoordinatesText.length-1); i++) {
     yCoordinates[i] = y - i
       * ((float) (y - padding_top) / (yCoordinatesText.length-1));
     canvas.drawText(yCoordinatesText[i], 20,
       yCoordinates[i ] + 5, pXyText);// 画文本
    
     if (i != (yCoordinatesText.length-1))
      canvas.drawLine(x, yCoordinates[i], /* padding_right */
        w - padding_right, yCoordinates[i], p);// 画小线
    }

   }

   // 画数据
   {
    {
     Path path = new Path();

     int lastPoint_index = -1;
     for (int i = 0; i < Datas.length; i++) {

      if (Datas[i] == -1)
       Datas[i] = 0;
      else if (Datas[i] < -1)
       continue;

      lastPoint_index = i;

      float data_x = xCoordinates[i];// X坐标
      float data_y = 0.0f;

      // 1,先算出Y轴每一等份的高度
      float yItemHeight = ((float) (y - (padding_top)) / (yCoordinates.length-1));

      if (Datas[i] <= 4.0f) {
       data_y = yItemHeight * 2 / 4 * Datas[i];
      } else if (Datas[i] <= 8.0f) {// 8M以下
       data_y = yItemHeight * 2 + yItemHeight / 4.0f * (Datas[i] - 4);
      } else if (Datas[i] <= 20.0f) {// 20M以下
       data_y = yItemHeight * 3 + yItemHeight / 12.0f * (Datas[i] - 8);
      } else if (Datas[i] <= 50.0f) {// 50M以下
       data_y = yItemHeight * 4 + yItemHeight / 30.0f * (Datas[i] - 20);
      } else if (Datas[i] <= 100.0f) {// 100M以下
       data_y = yItemHeight * 5 + yItemHeight / 50.0f * (Datas[i] - 50);
      }

      data_y = y - data_y;

      if (i == 0) {// 处理第一个坐标点,因为要计算多边形的前两个点
       path.moveTo(x, y);// 此点为多边形的起点
       prevX = x;
       prevY = y;
      } else {

      }
      path.lineTo(data_x, data_y);
      
      // 画线方式
      {
       canvas.drawLine(prevX, prevY, data_x, data_y,
         pDataLine);
       prevX = data_x;
       prevY = data_y;
       
      }

     }

     // 处理封口
     if (lastPoint_index >= 0) {
      path.lineTo(xCoordinates[lastPoint_index], y);
      path.close(); // 使这些点构成封闭的多边形
      // canvas.drawPath(path, pDataLine);
     }

     if (true)
      return;
    }

   }
  }
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值