Android中自定义折线图

本文介绍了如何在Android开发中自定义一个折线图控件,通过继承View并利用Canvas、Paint和Path来绘制图表。内容包括Y轴虚线、数据点、折线趋势和区域渲染等,实现数据的可视化展示。
摘要由CSDN通过智能技术生成

有时候,我们在做开发的时候,需要让用户更直观的看到数据变化,而又不应该给其提供一堆表格显示,有时候就需要用到,类似Excel中的图表,可是Google官方并没有提供自带的图表控件,这时候就需要我们自定义一个图表控件用于显示,我们想要的效果。(直接上图)如下:
趋势图
先分析一下,效果图(忽略标题栏)。最上面是运动天数共31天,间隔一定距离向右偏移。向下是Y轴虚线图,数量点图标及折线趋势,最后做了一下区域渲染。
此自定义控件需要继承View,一般情况下(不需要特殊要求的时候)我们自定义控件是都是继承自View/ViewGroup。当需要在某个控件基础上扩展的时候,才继承View/ViewGroup的子类。继承后需要从写onDraw()方法,在此方法中绘制图像,当然不可避免的需要用到几个东西:CanvasPaintPath
Paint:英文意思为油漆.绘画.描绘。在计算机中称为画笔。作用就类似于绘制图像要用的一样笔,当然可以为paint设置不同的颜色,实心或空心,透明度,粗细,抗锯齿等等,这些都可以通过set系列方法设置。比如,P.setAntiAlias(true)设置抗锯齿;P.setStrokeWidth(float)设置画笔粗细;P.setTextSize(float)设置画笔写的文字大小;P.setColor(Color.BLUE)设置颜色;P.setAlpha(int)设置透明度;P.setShader(shader)设置渲染器。
Canvas:英文意思是帆布,画布。简单理解就是,一个工具类,用于画我们想要的效果,比如直线,曲线,圆,矩形……调用draw系列方法可以实现。在从写ondraw(Canvas c)方法时系统会给我们一个Canvas类的对象,这样就可以通过调用一系列方法绘制我们想要的图形了。本片文章需要用到:
根据路径画线c.drawPath(path,paint);第一个参数为绘制的路径path对象,第二个参数为画笔对象paint。
根据起始点和终点画线c.drawLine(startX, startY, stopX, stopY, paint);前两个参数为起始点坐标(x,y)。后两个参数为终点坐标(x,y)。注意,我们在手机上的坐标系与生活中的坐标系0点位置不一样,在Android中屏幕坐标系,x轴为横轴,y轴为纵轴。但是起点即零点为屏幕左上角顶点,X轴向右逐渐增大,Y轴向下逐渐增大。通俗讲,X轴向右为正方向,Y轴向下为正方向。
画图c.drawBitmap(bitmap, left, top, paint);第一个参数bitmap对象,第二个与第三个参数为起始点(图的左上角点),第四个参数为paint画笔对象。注意,在Android中画任何图的时候,都应该有一个左上角点,不管是圆形,椭圆,不规则的图,都可以想象成一个矩形框包裹住,这样矩形的左上角顶点,就是绘制图形开始的起点,即向右边画。这样在控制图像位置时候,就会很精确。
画点c.drawPoint(x, y, paint);前两个参数为,点的坐标。最后为画笔工具。
画矩形c.drawRect(left, top, right, bottom, paint);前两个参数为矩形的左上角顶点坐标,然后两个参数为矩形的右下角顶点坐标,最后参数为paint画笔工具。用一张图更形象的理解。四根红色线代表前4个参数的距离。
这里写图片描述
画文本(写字)c.drawText(text, x, y, paint);第一个参数为要写的文本String,后面两个参数为画文本开始的左上角点位置(想象成在一个矩形框内写字,开始点为矩形的左上角点),一直在强调左上角。
Path:英文意思是路径,道路。Android中也是绘图路径的意思,一般和canvas一起用。介绍几个常用的方法看意思也知道意思的方法,p.lineTo(x, y)就是画线至(x,y)坐标位置。p.moveTo(x, y);将路径移动到(x,y)位置。p.close();关闭路径,即把终点和起点连起来。


说了一大堆废话,现在开始了,首先我们需要定义一些变量,用于绘制图形

    //折线图点集合
    private List<Integer> milliliter;
    //基准宽度
    private float tb;
    // 左右间距
    private float interval_left_right;
    // 左间距
    private float interval_left;
    // 画笔
    private Paint paint_date, paint_brokenLine, paint_dottedline,
            paint_brokenline_big, framPanint;
    //文本画笔
    private Paint textPaint;
    // 点图
    private Bitmap bitmap_point;
    //路径
    private Path path;
    //折线点上数字
    private float dotted_text;
    private int fineLineColor = 0x5faaaaaa; // 灰色,背景柱状图
    private int blueLineColor = 0xff00ffff; // 蓝色,线色

然后初始化要用到的变量参数。

if (null == milliliter || milliliter.size() == 0)
            return;
        this.milliliter = delZero(milliliter);
        Resources res = getResources();
        // 定义基准宽度
        tb = res.getDimension(R.dimen.historyscore_tb);
        interval_lef
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值