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;
}
}
}
}
}