自定义View练习(一个自定义的折线图)

LineChartView

xml文件中:

<com.example.qiaojingfei.linechartdemo.LineChartView
        android:layout_width="300dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true">
</com.example.qiaojingfei.linechartdemo.LineChartView>

java代码中:

  1. onMeasure()中获取控件的宽高,并转化成px
    //获取自定义控件的宽高
    if (widthMode == MeasureSpec.EXACTLY) {
            mWidth = widthSize;
    } else {
        mWidth = DimenUtils.dpToPx(300, getResources());
    }

    if (heightMode == MeasureSpec.EXACTLY) {
        mHeight = heightSize;
    } else {
        mHeight = DimenUtils.dpToPx(200, getResources());
    }

2.onDraw()中开始画坐标轴,然后描点连线。
* 坐标轴上的刻度用canvas.drawText()画;
* 坐标轴x和y轴用 canvas.drawLine()画;
* 坐标轴顶端箭头通过path来实现。

3.最后一步画点连线

 //画点
        Paint pointPaint = new Paint();
        pointPaint.setAntiAlias(true);
        pointPaint.setStyle(Paint.Style.FILL);
        pointPaint.setColor(Color.BLUE);
        pointXs = new ArrayList<>();
        pointYs = new ArrayList<>();
        for (int i = 0; i < pointMap.size(); i++) {
            float y = Float.valueOf(pointMap.get(String.valueOf(i)));
            float cx = paddingLeft + textLength + xSpace * i;
            float cy = mHeight - paddingBottom - (ySpace * (y / 10)) - textHeight - 5;
            pointXs.add(cx);
            pointYs.add(cy);
            Log.e("point", "pointX=" + cx + " pointY=" + cy);
            canvas.drawCircle(cx, cy, mPointRadius, pointPaint);
        }
        //画线
        for (int i = 0; i < pointMap.size(); i++) {
            if (i > 0) {
                canvas.drawLine(pointXs.get(i - 1), pointYs.get(i - 1), pointXs.get(i), pointYs.get(i), pointPaint);
            }
        }

项目地址:https://github.com/Tobi1025/LineChartDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值