Android自定义view-手把手教你画直方图,饼图.

直方图

  • 先画一个直角坐标系
package com.example.a16040657.customviewtest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by 16040657 on 2018/5/15.
 */

public class HistogramView extends View {
    public HistogramView(Context context) {
        super(context);
    }

    public HistogramView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HistogramView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

//    public HistogramView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
//        super(context, attrs, defStyleAttr, defStyleRes);
//    }

    Paint paint = new Paint();

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //开始直方图绘制
        //我们首先绘制竖向的一条黑色直线
        paint.setColor(Color.BLACK);
        //线的粗细先设置一下
        paint.setStrokeWidth(5);
        //坐标系都是针对自己view的顶点坐标(注意不是屏幕坐标哦) 点的坐标 x轴的值是一样的 所以可以得知这肯定是一条笔直的竖线
        canvas.drawLine(100, 200, 100, 800, paint);
        //然后依葫芦画瓢画一条横向的黑色直线 与上面这条竖着的直线 组成一个x轴和y轴
        canvas.drawLine(100, 800, 800, 800, paint);


    }
}

复制代码

看下效果:

  • 然后绘制第一个直方
 //绘制第一个矩形直方
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        //注意坐标都是 left, top, right, bottom
        canvas.drawRect(150, 700, 200, 800, paint);
        //然后在我们的直方下面绘制对应的文字

        paint.setTextSize(35);
        canvas.drawText("三星", 140, 840, paint);
复制代码

看下效果

  • 依葫芦画瓢 多画几个直方模块 组成一个完整的直方图。这里是全部代码
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //开始直方图绘制
        //我们首先绘制竖向的一条黑色直线
        paint.setColor(Color.BLACK);
        //线的粗细先设置一下
        paint.setStrokeWidth(5);
        //坐标系都是针对自己view的顶点坐标(注意不是屏幕坐标哦) 点的坐标 x轴的值是一样的 所以可以得知这肯定是一条笔直的竖线
        canvas.drawLine(100, 200, 100, 800, paint);
        //然后依葫芦画瓢画一条横向的黑色直线 与上面这条竖着的直线 组成一个x轴和y轴
        canvas.drawLine(100, 800, 800, 800, paint);

        //绘制第一个矩形直方
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        //注意坐标都是 left, top, right, bottom
        canvas.drawRect(150, 700, 200, 800, paint);
        //然后在我们的直方下面绘制对应的文字
        paint.setTextSize(35);
        canvas.drawText("三星", 140, 840, paint);

        //多画几个直方模组 组成一个完整的直方图
        canvas.drawRect(250, 500, 300, 800, paint);
//        paint.setTextSize(35);
        canvas.drawText("苹果", 240, 840, paint);


        canvas.drawRect(350, 300, 400, 800, paint);
//        paint.setTextSize(35);
        canvas.drawText("小米", 340, 840, paint);

        canvas.drawRect(450, 200, 500, 800, paint);
        //销冠华为颜色就特殊点吧
        paint.setColor(Color.BLUE);
        canvas.drawText("华为", 440, 840, paint);


    }
复制代码

最后看下效果:

基本上直方图算是最简单的一种自定义view,这里给出基本画法,拿到项目里面用各位就需要自定义一些属性,然后坐标的值根据属性算一下而已,算的上比较简单的一种自定义view了。大体思路和画法是不变的

稍微复杂点的饼图

  • 先看看饼图的核心怎么画,代码很少,略微涉及到一点初中数学知识。
package com.example.a16040657.customviewtest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by 16040657 on 2018/5/15.
 */

public class PieGraphView extends View {
    public PieGraphView(Context context) {
        super(context);
    }

    public PieGraphView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PieGraphView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    Paint paint = new Paint();

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //饼图的核心其实就是画好扇形就成功了一大半了
        //饼图的核心就是一个圆形,学会切割圆形,就知道怎么画饼图
        //先绘制一个整体的背景
        canvas.drawColor(Color.GRAY);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.BLUE);

        //这里要注意的是标准的饼图是一个圆形,那既然是圆形,这里right和left的差值要和 top和bottom的差值相等
        //因为只有对应的矩形长宽相等,里面才是个圆形 最终画出来的才是完整的圆形否则就是不规则的椭圆很难看
        //-110的这个参数 是起始角度 100这个参数是划过的角度 ,这里的划 代表是顺时针, x轴方向是0度,这个地方要自己体会一下
        canvas.drawArc(200, 700, 800, 1300, -110, 100, true, paint); // 绘制扇形
        paint.setColor(Color.RED);
        //保证饼图的重合性,可以看出来 这个-10的值 就是 -110+100得到的,上一个扇形的尾巴等于这个一个扇形的头
        canvas.drawArc(200, 700, 800, 1300, -10, 50, true, paint); // 绘制扇形
        paint.setColor(Color.YELLOW);
        //最后画一个大的,完成这个圆即可,注意这里 三个划过的角度是100+50+210=360 刚好是一个圆形的角度 且起始角度40的值就是上一个扇形的-10+50 计算而来,这样就完美组成了一个完整的圆形饼图
        canvas.drawArc(200, 700, 800, 1300, 40, 210, true, paint); // 绘制扇形


    }
}

复制代码

然后看看效果

  • 光有图还不行,还得看告诉别人这些饼图代表什么
 paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(6);
        Path path = new Path();
        //为了好理解 我们先回到这个圆形的中心点
        path.moveTo(500, 1000);
        //然后再挪动到蓝色的区域某个位置
        path.moveTo(550, 900);
        //然后画一条斜线
        path.lineTo(700, 750);
        //然后再斜线的末端相对平移一下
        path.rLineTo(100,0);
        canvas.drawPath(path, paint);
        //最后再绘制一个文字
        paint.reset();
        paint.setTextSize(35);
        paint.setColor(Color.WHITE);
        canvas.drawText("JAVA",810,750,paint);
复制代码

看下效果:

  • 最后补全代码看下整体效果
package com.example.a16040657.customviewtest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by 16040657 on 2018/5/15.
 */

public class PieGraphView extends View {
    public PieGraphView(Context context) {
        super(context);
    }

    public PieGraphView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PieGraphView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    Paint paint = new Paint();

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //饼图的核心其实就是画好扇形就成功了一大半了
        //饼图的核心就是一个圆形,学会切割圆形,就知道怎么画饼图
        //先绘制一个整体的背景
        canvas.drawColor(Color.GRAY);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.BLUE);

        //这里要注意的是标准的饼图是一个圆形,那既然是圆形,这里right和left的差值要和 top和bottom的差值相等
        //因为只有对应的矩形长宽相等,里面才是个圆形 最终画出来的才是完整的圆形否则就是不规则的椭圆很难看
        //-110的这个参数 是起始角度 100这个参数是划过的角度 ,这里的划 代表是顺时针, x轴方向是0度,这个地方要自己体会一下
        canvas.drawArc(200, 700, 800, 1300, -110, 100, true, paint); // 绘制扇形
        paint.setColor(Color.RED);
        //保证饼图的重合性,可以看出来 这个-10的值 就是 -110+100得到的,上一个扇形的尾巴等于这个一个扇形的头
        canvas.drawArc(200, 700, 800, 1300, -10, 50, true, paint); // 绘制扇形
        paint.setColor(Color.YELLOW);
        //最后画一个大的,完成这个圆即可,注意这里 三个划过的角度是100+50+210=360 刚好是一个圆形的角度 且起始角度40的值就是上一个扇形的-10+50 计算而来,这样就完美组成了一个完整的圆形饼图
        canvas.drawArc(200, 700, 800, 1300, 40, 210, true, paint); // 绘制扇形

        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(6);
        Path path = new Path();
        //为了好理解 我们先回到这个圆形的中心点
        path.moveTo(500, 1000);
        //然后再挪动到蓝色的区域某个位置
        path.moveTo(550, 900);
        //然后画一条斜线
        path.lineTo(700, 750);
        //然后再斜线的末端相对平移一下
        path.rLineTo(100, 0);
        canvas.drawPath(path, paint);
        //最后再绘制一个文字
        paint.reset();
        paint.setTextSize(35);
        paint.setColor(Color.WHITE);
        canvas.drawText("JAVA", 810, 750, paint);


        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(6);
        Path path2 = new Path();
        path2.moveTo(550, 1000);
        path2.lineTo(650, 1100);
        path2.rLineTo(200, 0);
        canvas.drawPath(path2, paint);
        paint.reset();
        paint.setTextSize(35);
        paint.setColor(Color.WHITE);
        canvas.drawText("PYTHON", 860, 1100, paint);



        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(6);
        Path path3 = new Path();
        path3.moveTo(400, 1050);
        path3.lineTo(250, 1100);
        path3.rLineTo(-100, 0);
        canvas.drawPath(path3, paint);
        paint.reset();
        paint.setTextSize(35);
        paint.setColor(Color.WHITE);
        canvas.drawText("C++", 80, 1100, paint);


    }
}

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值