话不多说,直奔主题:
首先封装一个读取本地文件的类:
public class TxtReader {
/**
* 通过一个InputStream获取内容
*
* @param inputStream
* @return
*/
static String getString(InputStream inputStream) {
InputStreamReader inputStreamReader = null;
try {
inputStreamReader = new InputStreamReader(inputStream, "gbk");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
assert inputStreamReader != null;
BufferedReader reader = new BufferedReader(inputStreamReader);
StringBuilder sb = new StringBuilder("");
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* ͨ
*
* @param filepath
* @return
*/
public static String getString(String filepath) {
File file = new File(filepath);
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return getString(fileInputStream);
}
}
画心电图的类:
public class Electrocardiogram extends View{
private float gap_x; //两点间横坐标间距
private int dataNum_per_grid = 18; //每小格内的数据个数
private int xori;//原点x坐标
private final static String TAG = Electrocardiogram.class.getSimpleName();
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler(){};
private boolean mIsDrawGird = true; // 是否画网格
private Paint paint;
private Paint electrocarPaint; // 画心电图曲线的画笔
private Path electrocarPath; // 心电图曲线的轨迹 path
private int width;
private int height;
private int baseLine; // 基准线
private int horizontalBigGirdNum; //= 6; // 横向的线,即纵向大格子的数量,每个大格子里面包含5个小格子
private int verticalBigGirdNum; //= 8; // 纵向的线,即横向大格子的数量。
private int widthOfSmallGird; // 小格子的宽度
private List<Float> datas = new ArrayList<Float>();
private List<Float> electrocardDatas = new ArrayList<Float>();
private int index = 0;
public Electrocardiogram(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public Electrocardiogram(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
paint = new Paint(); // 画网格的 Paint
paint.setStyle(Paint.Style.STROKE);
electrocarPaint = new Paint(); // 画心电图曲线的 Paint
electrocarPaint.setColor(Color.BLACK);
electrocarPaint.setStyle(Paint.Style.STROKE);
electrocarPaint.setAntiAlias(true); //抗锯齿
electrocarPaint.setStrokeWidth(3);
electrocarPath = new Path(); // 心电图的轨迹 Path
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.e(TAG,"onMeasure");
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.e(TAG,"onSizeChanged");
xori = 0;
widthOfSmallGird = 18;
width = w;
height = h;
horizontalBigGirdNum = height/widthOfSmallGird; //横线条数
verticalBigGirdNum = width/widthOfSmallGird; //纵线条数
gap_x = widthOfSmallGird/dataNum_per_grid; //两点间横坐标间距
//widthOfSmallGird = width / (verticalBigGirdNum * 10); // 小网格的宽度,每个大网格有 5 个小网格
baseLine = height / 2; // 基准线位于中间
//maxLevel = height / 3; // 心电图曲线最大的高度
setData(); // 设置数据
}
@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
Log.e(TAG,"onDraw");
if( mIsDrawGird ){ // 是否画网格
drawGird(canvas); // 画网格
}
drawElectrocardiogram(canvas); // 画心电图
}
/**
* 画心电图曲线
*/
private void drawElectrocardiogram(Canvas canvas) {
for (int i = 0; i < electrocardDatas.size(); i++){
electrocarPath.moveTo(i * gap_x,electrocardDatas.get(i));
break;
}
for (int i = 0; i < electrocardDatas.size(); i++){
electrocarPath.lineTo(i * gap_x ,electrocardDatas.get(i));
}
canvas.drawPath(electrocarPath,electrocarPaint);
}
/**
* 增加数据,使心电图呈现由左到右显示出波形的效果
*/
public void addData(){
if(datas.size() > 0) {
// datas 是收集到的数据, electrocardDatas 是显示在屏幕的数据,两者都是 ArrayList<Float>
electrocardDatas.add(datas.get(index));
if (index % 720 == 0){
electrocardDatas.clear();
electrocarPath.reset();
index ++;
}
else if (index >= datas.size() - 1){
index = 0;
electrocardDatas.clear();
electrocarPath.reset();
datas.clear();
generateElectrocar();
}
else {
index++;
}
//
invalidate();
}
}
Runnable runnable;
public void startDraw(){
runnable = new Runnable() {
@Override
public void run() {
for(int i=0;i<=10;i++){
addData();
}
mHandler.postDelayed(runnable,3); // 100 ms 增加十个数据,即10个点
}
};
mHandler.post(runnable);
}
public void setData(){
generateElectrocar();
// System.out.println();
Log.e(TAG,datas+"");
}
// 随机生成的心电图序列 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 55.05766, -240.32986, 230.08057, -148.4218, 53.343708, -68.89675, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 145.64384, -92.638756, 223.0892, -93.22228, 40.925827, -123.40388, 0.0, 0.0, 0.0, 0.0]
Runnable runnable1=new Runnable() {
@Override
public void run() {
catchData();
}
};
Runnable runnable2=new Runnable() {
@Override
public void run() {
catchData();
}
};
Runnable runnable3=new Runnable() {
@Override
public void run() {
catchData();
}
};
public void catchData(){
InputStream inputStream = getResources().openRawResource(R.raw.nor);
String str = TxtReader.getString(inputStream);
String[] arrayString = str.split(",");
Float[] arrayFloat = new Float[arrayString.length];
for (int i = 0; i < arrayString.length; i++){
arrayFloat[i] = Float.parseFloat(arrayString[i]);
arrayFloat[i] = (arrayFloat[i] - 2100) *(-1);
arrayFloat[i] = arrayFloat[i]*3/4 + baseLine;
datas.add(arrayFloat[i]);
}
}
public void generateElectrocar(){
InputStream inputStream = getResources().openRawResource(R.raw.nor);
String str = TxtReader.getString(inputStream);
String[] arrayString = str.split(",");
Float[] arrayFloat = new Float[arrayString.length];
for (int i = 0; i < arrayString.length; i++){
arrayFloat[i] = Float.parseFloat(arrayString[i]);
arrayFloat[i] = (arrayFloat[i] - 2100) *(-1);
arrayFloat[i] = arrayFloat[i]*3/4 + baseLine;
datas.add(arrayFloat[i]);
}
}
/**
* 画网格
*/
private void drawGird(Canvas canvas){
//横线
for (int i = 1 ; i < horizontalBigGirdNum + 2 ; i ++){
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED); //<color name="data_pr">#0a7b14</color>
paint.setStrokeWidth(1.5f);
Path path = new Path();
path.moveTo(xori, widthOfSmallGird * (i-1) + (height-horizontalBigGirdNum*widthOfSmallGird)/2);
path.lineTo(width,widthOfSmallGird * (i-1) + (height-horizontalBigGirdNum*widthOfSmallGird)/2);
if ( i % 5 != 0 ){//每第五条,为实线 其余为虚线 ,以下为画虚线方法
PathEffect effect = new DashPathEffect(new float[]{1,5},1);
paint.setPathEffect(effect);
}
canvas.drawPath(path,paint);
}
//竖线
for (int i = 1 ; i < verticalBigGirdNum + 2 ; i ++){
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth(1.5f);
Path path = new Path();
path.moveTo(widthOfSmallGird * (i-1) + (width-verticalBigGirdNum*widthOfSmallGird)/2, 0);
path.lineTo(widthOfSmallGird * (i-1) + (width-verticalBigGirdNum*widthOfSmallGird)/2,height);
if ( i % 5 != 0 ){
PathEffect effect = new DashPathEffect(new float[]{1,5},1);
paint.setPathEffect(effect);
}
canvas.drawPath(path,paint);
}
}
}