博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android自定义view-手把手教你画直方图,饼图.
阅读量:5934 次
发布时间:2019-06-19

本文共 8121 字,大约阅读时间需要 27 分钟。

直方图

  • 先画一个直角坐标系
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);    }}复制代码

转载地址:http://djjtx.baihongyu.com/

你可能感兴趣的文章
Centos下基于Hadoop安装Spark(分布式)
查看>>
POJ2348 UVa10368 HDU1525 Euclid's Game【博弈】
查看>>
用API操作串口
查看>>
Java 位运算
查看>>
好用的CSS模块化打包工具CSS-COMBO
查看>>
python 中的字符和字符串
查看>>
C#Winform限制Textbox只能输入数字
查看>>
USACO 3.1.4 [Shaping Regions]
查看>>
美化 Linux 字体显示
查看>>
12月28日 进制转换的另种方法
查看>>
三十而立
查看>>
[Python]模块、包
查看>>
阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 php
查看>>
Learning Cocos2d-x for WP8(1)——创建首个项目
查看>>
[转]SSIS: Execute Package via Stored Procedure
查看>>
[WinAPI] API 7 [判断光驱内是否有光盘]
查看>>
2014-3-12 星期三 小雨 [及时完成不堆积]
查看>>
菜鸟调错(一)——Maven项目部署到Jboss出现:Failed to create a new SAX parser
查看>>
android---APN切换
查看>>
dijit样式定制之TextBox(一)
查看>>