Android画图标

来源:互联网 发布:网络刻章在线制作 编辑:程序博客网 时间:2024/06/06 02:41

转至:http://blog.csdn.net/dawanganban/article/details/31445249


public class MyView extends View {private static int ORIGIN_X = 60; // 原点x坐标private static int ORIGIN_Y = 260;// 原点y坐标private static int X_SCALE = 8; // 刻度长度private static int Y_SCALE = 40;private static int X_LENGTH = 380; // x轴总长度private static int Y_LENGTH = 240;private static int MAX_DATA_SIZE = X_LENGTH / X_SCALE; // 最大数据个数private static int Y_SCALE_COUNT = Y_LENGTH / Y_SCALE; // y轴刻度个数private List<Integer> data = new ArrayList<Integer>(); // 数据值集合private String[] YLabels = new String[Y_LENGTH / Y_SCALE]; // Y轴标签// View刷新private Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 0) {MyView.this.invalidate();}};};Paint paint = new Paint();public MyView(Context context, AttributeSet attrs) {super(context, attrs);// 初始化y轴标签for (int i = 0; i < YLabels.length; i++) {YLabels[i] = i + "M/s";}// 每秒钟随机加入一个数据,删除第一个数据,然后刷新randomData();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 画标签和坐标轴drawLabelAndAxes(canvas);//// 画数据,对应的线条//// drawDataLine(canvas);//第一种方式// 画数据,对应的路径//// drawDataPath(canvas);//第二种方式drawDataPath2(canvas);// 第二种方式,加一层外线 }private void drawDataPath2(Canvas canvas) {paint.setColor(Color.parseColor("#73B0C4"));paint.setAntiAlias(true); // 去锯齿paint.setStyle(Paint.Style.FILL);Paint paintLine = new Paint();paintLine.setColor(Color.RED);paintLine.setAntiAlias(true); // 去锯齿paintLine.setStyle(Paint.Style.STROKE);if (data.size() > 1) {Path path = new Path();Path pathLine = new Path();path.moveTo(ORIGIN_X, ORIGIN_Y); // 原点起pathLine.moveTo(ORIGIN_X, ORIGIN_Y - data.get(0) * Y_SCALE);for (int i = 0; i < data.size(); i++) {path.lineTo(ORIGIN_X + i * X_SCALE, ORIGIN_Y - data.get(i)* Y_SCALE); // 中间点pathLine.lineTo(ORIGIN_X + i * X_SCALE, ORIGIN_Y - data.get(i)* Y_SCALE); // 中间点}path.lineTo(ORIGIN_X + (data.size() - 1) * X_SCALE, ORIGIN_Y); // x轴上点结束canvas.drawPath(path, paint);// 画线下背景canvas.drawPath(pathLine, paintLine);// 画线}}private void drawDataPath(Canvas canvas) {paint.setStyle(Paint.Style.FILL);if (data.size() > 1) {Path path = new Path();path.moveTo(ORIGIN_X, ORIGIN_Y); // 原点起for (int i = 0; i < data.size(); i++) {path.lineTo(ORIGIN_X + i * X_SCALE, ORIGIN_Y - data.get(i)* Y_SCALE); // 中间点}path.lineTo(ORIGIN_X + (data.size() - 1) * X_SCALE, ORIGIN_Y); // x轴上点结束canvas.drawPath(path, paint);}}private void randomData() {new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}if (data.size() >= MAX_DATA_SIZE) {data.remove(0);}data.add(new Random().nextInt(4) + 1);handler.sendEmptyMessage(0);}}}).start();}private void initPaint() {paint.setStyle(Paint.Style.STROKE);paint.setAntiAlias(true); // 去锯齿paint.setColor(Color.BLUE);}private void drawDataLine(Canvas canvas) {if (data.size() > 1) {for (int i = 1; i < data.size(); i++) {canvas.drawLine(ORIGIN_X + (i - 1) * X_SCALE,ORIGIN_Y - data.get(i - 1) * Y_SCALE, ORIGIN_X + i* X_SCALE, ORIGIN_Y - data.get(i) * Y_SCALE,paint);}}}private void drawLabelAndAxes(Canvas canvas) {// 初始化画笔initPaint();// 画Y轴canvas.drawLine(ORIGIN_X, ORIGIN_Y - Y_LENGTH, ORIGIN_X, ORIGIN_Y,paint);// Y轴箭头canvas.drawLine(ORIGIN_X, ORIGIN_Y - Y_LENGTH, ORIGIN_X - 3, ORIGIN_Y- Y_LENGTH + 6, paint);canvas.drawLine(ORIGIN_X, ORIGIN_Y - Y_LENGTH, ORIGIN_X + 3, ORIGIN_Y- Y_LENGTH + 6, paint);// 添加刻度和文字for (int i = 0; i < Y_SCALE_COUNT; i++) {canvas.drawLine(ORIGIN_X, ORIGIN_Y - i * Y_SCALE, ORIGIN_X + 5,ORIGIN_Y - i * Y_SCALE, paint); // 刻度canvas.drawText(YLabels[i], ORIGIN_X - 50, ORIGIN_Y - i * Y_SCALE,paint);// 文字}// 画X轴canvas.drawLine(ORIGIN_X, ORIGIN_Y, ORIGIN_X + X_LENGTH, ORIGIN_Y,paint);}}


0 0