Android自定义心率图表

最近有需求需要展示蓝牙设备的心率数据,每半小时一个心率值,在图表中显示。有很多第三方的开源图表库可以选择,比如MPAndroidChart等优秀的图表库,最后还是决定自定义vie,上上手,以作练习,效果如下图:

心率数据可以动态设置,刻度值目前在view中设置,各种颜色可在xml文件中配置,接下来记录如何实现。 

 

//点的画笔
    private Paint pointPaint;
    //连线的画笔
    private Paint pathPaint;

    //path
    private Path linPath;

    //点的颜色
    private int pointColor;
    //点的半径
    private float circleRadius;
    //线的颜色
    private int linColor;

    //绘制坐标轴的paint
    private Paint xyLinPaint;

    //绘制虚线的画笔
    private Paint benchPaint;

    //绘制y轴刻度的画笔
    private Paint yScalePaint;

    //是否显示x轴
    private boolean isShowX = false;
    //是否显示y轴
    private boolean isShowY = false;

    //宽高
    private float mWidth,mHeight;

    //数据源
    private List<Integer> dataLists = new ArrayList<>();

主要代码,实现起来比较简单 

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mWidth = getMeasuredWidth();
        mHeight = getMeasuredHeight();
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //坐标平移
        canvas.translate(0,mHeight);
        canvas.save();
        if(!dataLists.isEmpty()){
            //间隔的宽度
            float mCurrWidth = mWidth / dataLists.size();

            //绘制坐标轴
            drawXYLin(canvas,mCurrWidth);

            //绘制点
            for(int i = 0;i<dataLists.size();i++){
                //绘制点
                canvas.drawCircle(mCurrWidth*i+dp2px(10),-dp2px(dataLists.get(i)),circleRadius,pointPaint);

            }

            //连线
            for(int k = 0;k<dataLists.size();k++){
                if(k == 0){
                    linPath.moveTo(mCurrWidth * k +dp2px(10),-dp2px(dataLists.get(k)));
                }else{
                    linPath.lineTo(mCurrWidth * k +dp2px(10),-dp2px(dataLists.get(k)));
                }
            }
            canvas.drawPath(linPath,pathPaint);




        }
    }

    private void drawXYLin(Canvas canvas,float currWidth) {

        //绘制y的标线
        if(isShowY){
            //60
            canvas.drawLine(dp2px(10),-dp2px(60),mWidth,-dp2px(60),benchPaint);
            canvas.drawText("60",0,-dp2px(60)+getTextHeight(yScalePaint,60+"")/2,yScalePaint);

            //80
            canvas.drawLine(dp2px(10),-dp2px(90),mWidth,-dp2px(90),benchPaint);
            canvas.drawText("90",0,-dp2px(90)+getTextHeight(yScalePaint,80+"")/2,yScalePaint);
            //120
            canvas.drawLine(dp2px(10),-dp2px(120),mWidth,-dp2px(120),benchPaint);
            canvas.drawText("120",0,-dp2px(120)+getTextHeight(yScalePaint,120+"")/2,yScalePaint);
        }


        if(isShowX){
            //x轴
            canvas.drawLine(0,-dp2px(10),mWidth,-dp2px(10),xyLinPaint);
            //x轴刻度及下标
            for(int i = 0;i<dataLists.size();i++){

                canvas.drawLine(currWidth * i +dp2px(10),-dp2px(10),currWidth * i +dp2px(10),-dp2px(15),xyLinPaint);

                canvas.drawText(String.valueOf(i+1),currWidth * i +dp2px(10)-getTextWidth(yScalePaint,String.valueOf(i+1))/2,0,yScalePaint);

            }
        }

    }
//设置数据
    public void setDataList(List<Integer> dataList) {
        this.dataLists = dataList;
        linPath.reset();
        invalidate();
    }

    //是否显示x轴的刻度
    public void setShowX(boolean showX) {
        isShowX = showX;
    }

    //是否显示y轴的刻度
    public void setShowY(boolean showY) {
        isShowY = showY;
    }

 

 需要注意的地方为,在连线时Paint的Style中有三个枚举,分别为:Style.FILL,Style.STROKE,Style.FILL_AND_STROKE;

Paint.Style.STROKE 只绘制图形轮廓(描边) 
Paint.Style.FILL 只绘制图形内容 
Paint.Style.FILL_AND_STROKE 既绘制轮廓也绘制内容

这里绘制线,只需要设置STROKE只绘制轮廓即可。目前未加入动画效果,后续再研究加入;GitHub链接:

代码下载       CSND下载链接:CSDN下载

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Android自定义半圆圆弧显示心率数据,可以按照以下步骤: 1. 创建一个自定义View,继承View类,并实现onDraw方法。 2. 在onDraw方法中,使用Canvas画布绘制圆弧。可以使用Paint类来设置绘制圆弧的颜色、宽度等属性。 3. 计算并绘制心率数据。可以使用Path类绘制心率曲线,也可以使用Canvas.drawText方法绘制心率数据。 4. 在Activity中使用这个自定义View,将心率数据传入,实现数据的动态显示。 下面是一个简单示例代码: ```java public class HeartRateView extends View { private Paint mPaint; private Path mPath; private RectF mRectF; private float mStartAngle; private float mSweepAngle; public HeartRateView(Context context) { super(context); init(); } public HeartRateView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public HeartRateView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(10); mPaint.setColor(Color.RED); mPath = new Path(); mRectF = new RectF(); mRectF.set(100, 100, 500, 500); mStartAngle = 135; mSweepAngle = 270; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawArc(mRectF, mStartAngle, mSweepAngle, false, mPaint); mPath.reset(); mPath.moveTo(100, 300); mPath.quadTo(300, 100, 500, 300); mPath.quadTo(700, 500, 900, 300); canvas.drawPath(mPath, mPaint); mPaint.setStyle(Paint.Style.FILL); mPaint.setTextSize(40); canvas.drawText("心率数据", 400, 600, mPaint); } } ``` 在Activity中使用这个自定义View: ```java public class MainActivity extends AppCompatActivity { private HeartRateView mHeartRateView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHeartRateView = findViewById(R.id.heart_rate_view); // 模拟心率数据 new Thread(new Runnable() { @Override public void run() { for (int i = 60; i <= 120; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mHeartRateView.post(new Runnable() { @Override public void run() { mHeartRateView.invalidate(); } }); } } }).start(); } } ``` 在布局文件中引入这个自定义View: ```xml <com.example.heartrate.HeartRateView android:id="@+id/heart_rate_view" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 这样就可以实现Android自定义半圆圆弧显示心率数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值