日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

动态折线图-Android篇

發布時間:2025/1/21 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态折线图-Android篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候我們在項目中會遇到使用折線圖等圖形,Android的開源項目中為我們提供了很多插件,如achartengine第三方Jar包。但是很多時候我們需要根據具體項目自定義這些圖表,這一篇文章我們一起來看看如何在Android中使用Canvas繪制折線圖。先看看繪制的效果:


原理很簡單,我就直接給出代碼:

package com.example.testcanvasdraw;import java.util.ArrayList; import java.util.List; import java.util.Random;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View;public class MyView extends View{private int XPoint = 60;private int YPoint = 260;private int XScale = 8; //刻度長度private int YScale = 40;private int XLength = 380;private int YLength = 240;private int MaxDataSize = XLength / XScale;private List<Integer> data = new ArrayList<Integer>();private String[] YLabel = new String[YLength / YScale];private Handler handler = new Handler(){public void handleMessage(Message msg) {if(msg.what == 0x1234){MyView.this.invalidate();}};};public MyView(Context context, AttributeSet attrs) {super(context, attrs);for(int i=0; i<YLabel.length; i++){YLabel[i] = (i + 1) + "M/s";}new Thread(new Runnable() {@Overridepublic void run() {while(true){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if(data.size() >= MaxDataSize){data.remove(0);}data.add(new Random().nextInt(4) + 1);handler.sendEmptyMessage(0x1234);}}}).start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setStyle(Paint.Style.STROKE);paint.setAntiAlias(true); //去鋸齒paint.setColor(Color.BLUE);//畫Y軸canvas.drawLine(XPoint, YPoint - YLength, XPoint, YPoint, paint);//Y軸箭頭canvas.drawLine(XPoint, YPoint - YLength, XPoint - 3, YPoint-YLength + 6, paint); //箭頭canvas.drawLine(XPoint, YPoint - YLength, XPoint + 3, YPoint-YLength + 6 ,paint);//添加刻度和文字for(int i=0; i * YScale < YLength; i++) {canvas.drawLine(XPoint, YPoint - i * YScale, XPoint + 5, YPoint - i * YScale, paint); //刻度canvas.drawText(YLabel[i], XPoint - 50, YPoint - i * YScale, paint);//文字}//畫X軸canvas.drawLine(XPoint, YPoint, XPoint + XLength, YPoint, paint);System.out.println("Data.size = " + data.size());if(data.size() > 1){for(int i=1; i<data.size(); i++){canvas.drawLine(XPoint + (i-1) * XScale, YPoint - data.get(i-1) * YScale, XPoint + i * XScale, YPoint - data.get(i) * YScale, paint);}}} }

上面繪制折線部分我們還有一種方式同樣可以實現:

if(data.size() > 1){Path path = new Path();path.moveTo(XPoint, YPoint - data.get(0) * YScale);for(int i=1; i<data.size(); i++){path.lineTo(XPoint + i * XScale, YPoint - data.get(i) * YScale);}canvas.drawPath(path, paint); }

下面我們將上面代碼修改,讓折線下面的區域顏色填充:


package com.example.testcanvasdraw;import java.util.ArrayList; import java.util.List; import java.util.Random;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View; /*** * @author 陽光小強* http://blog.csdn.net/dawanganban**/ public class MyView extends View {private int XPoint = 60;private int YPoint = 260;private int XScale = 8; // 刻度長度private int YScale = 40;private int XLength = 380;private int YLength = 240;private int MaxDataSize = XLength / XScale;private List<Integer> data = new ArrayList<Integer>();private String[] YLabel = new String[YLength / YScale];private Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 0x1234) {MyView.this.invalidate();}};};public MyView(Context context, AttributeSet attrs) {super(context, attrs);for (int i = 0; i < YLabel.length; i++) {YLabel[i] = (i + 1) + "M/s";}new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (data.size() >= MaxDataSize) {data.remove(0);}data.add(new Random().nextInt(4) + 1);handler.sendEmptyMessage(0x1234);}}}).start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setStyle(Paint.Style.STROKE);paint.setAntiAlias(true); // 去鋸齒paint.setColor(Color.BLUE);// 畫Y軸canvas.drawLine(XPoint, YPoint - YLength, XPoint, YPoint, paint);// Y軸箭頭canvas.drawLine(XPoint, YPoint - YLength, XPoint - 3, YPoint - YLength+ 6, paint); // 箭頭canvas.drawLine(XPoint, YPoint - YLength, XPoint + 3, YPoint - YLength+ 6, paint);// 添加刻度和文字for (int i = 0; i * YScale < YLength; i++) {canvas.drawLine(XPoint, YPoint - i * YScale, XPoint + 5, YPoint - i* YScale, paint); // 刻度canvas.drawText(YLabel[i], XPoint - 50, YPoint - i * YScale, paint);// 文字}// 畫X軸canvas.drawLine(XPoint, YPoint, XPoint + XLength, YPoint, paint);// 繪折線/** if(data.size() > 1){ for(int i=1; i<data.size(); i++){* canvas.drawLine(XPoint + (i-1) * XScale, YPoint - data.get(i-1) ** YScale, XPoint + i * XScale, YPoint - data.get(i) * YScale, paint); }* }*/paint.setStyle(Paint.Style.FILL);if (data.size() > 1) {Path path = new Path();path.moveTo(XPoint, YPoint);for (int i = 0; i < data.size(); i++) {path.lineTo(XPoint + i * XScale, YPoint - data.get(i) * YScale);}path.lineTo(XPoint + (data.size() - 1) * XScale, YPoint);canvas.drawPath(path, paint);}} }

上面的效果有時候還是達不到我們的要求,我們將代碼修改后效果如下:


package com.example.testcanvasdraw;import java.util.ArrayList; import java.util.List; import java.util.Random;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View;/*** * @author 陽光小強 http://blog.csdn.net/dawanganban* */ public class MyView extends View {private int XPoint = 60;private int YPoint = 260;private int XScale = 8; // 刻度長度private int YScale = 40;private int XLength = 380;private int YLength = 240;private int MaxDataSize = XLength / XScale;private List<Integer> data = new ArrayList<Integer>();private String[] YLabel = new String[YLength / YScale];private Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 0x1234) {MyView.this.invalidate();}};};public MyView(Context context, AttributeSet attrs) {super(context, attrs);for (int i = 0; i < YLabel.length; i++) {YLabel[i] = (i + 1) + "M/s";}new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}if (data.size() >= MaxDataSize) {data.remove(0);}data.add(new Random().nextInt(4) + 1);handler.sendEmptyMessage(0x1234);}}}).start();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setStyle(Paint.Style.STROKE);paint.setAntiAlias(true); // 去鋸齒paint.setColor(Color.BLUE);// 畫Y軸canvas.drawLine(XPoint, YPoint - YLength, XPoint, YPoint, paint);// Y軸箭頭canvas.drawLine(XPoint, YPoint - YLength, XPoint - 3, YPoint - YLength+ 6, paint); // 箭頭canvas.drawLine(XPoint, YPoint - YLength, XPoint + 3, YPoint - YLength+ 6, paint);// 添加刻度和文字for (int i = 0; i * YScale < YLength; i++) {canvas.drawLine(XPoint, YPoint - i * YScale, XPoint + 5, YPoint - i* YScale, paint); // 刻度canvas.drawText(YLabel[i], XPoint - 50, YPoint - i * YScale, paint);// 文字}// 畫X軸canvas.drawLine(XPoint, YPoint, XPoint + XLength, YPoint, paint);// 繪折線/** if(data.size() > 1){ for(int i=1; i<data.size(); i++){* canvas.drawLine(XPoint + (i-1) * XScale, YPoint - data.get(i-1) ** YScale, XPoint + i * XScale, YPoint - data.get(i) * YScale, paint); }* }*/paint.setColor(Color.RED);paint.setStrokeWidth(5);Paint paint2 = new Paint();paint2.setColor(Color.BLUE);paint2.setStyle(Paint.Style.FILL);if (data.size() > 1) {Path path = new Path();Path path4 = new Path();path.moveTo(XPoint, YPoint - data.get(0) * YScale);path4.moveTo(XPoint, YPoint);for (int i = 0; i < data.size(); i++) {path.lineTo(XPoint + i * XScale, YPoint - data.get(i) * YScale);path4.lineTo(XPoint + i * XScale, YPoint - data.get(i) * YScale);}path4.lineTo(XPoint + (data.size() - 1) * XScale, YPoint);canvas.drawPath(path, paint);canvas.drawPath(path4, paint2);}} }


原作者:http://www.it165.net/pro/html/201406/15815.html





總結

以上是生活随笔為你收集整理的动态折线图-Android篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。