android自定义view之画心电图(1)

话不多说,直奔主题:

首先封装一个读取本地文件的类:

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


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值