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