零点一

小德我这几天都在做一个“大工程”,几天没来。那今天就来分享一个好玩的小项目:自定义View,在view中绘制一个哆啦A梦。


我在主页看到有人用JS画了个蓝胖子,由于小德我很喜欢,所以我在Android中也画了一个,也可以练习一下View中的绘制方法。

零点一点一

先看看我的成果:



首先我们要自定义一个类继承View,然后重载关于绘制的方法ondraw

public class Doraemon extends View {
    public Doraemon(Context context, AttributeSet attrs){//注意构造方法的参数,否则会报错
        super(context, attrs);
    }
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
    }
}
复制代码

在onDraw中我们就可以开始绘制了,参数canvas就是画布,有许多绘制的方法。

二、我们用什么画画

画画要有画布和画笔,画布就是上边说的canvas,二画笔就是Paint类了。

画笔Paint

①我们首先要实例化一个Paint对象

Paint paint = new Paint();
复制代码

②我们之后要选择用哪种的画笔:

paint.setStyle();
复制代码

可选的参数有:Paint.Style.FILL:填充内部,Paint.Style.FILL_AND_STROKE :填充内部和描边,Paint.Style.STROKE :描边

画笔还有很多参数可以选择,比较常用的:

reset():换一个画笔(重置)

setAntiAlias(boolean a):设置抗锯齿

setAlpha(int a):设置透明度[0-255],0是完全透明,255是完全不透明

setStrokeWidth(float width):画笔样式是描边的话设置画笔粗细。

③接着我们选个合适的颜色:

我们可以通过Color类的预设的变量直接设置颜色

paint.setColor(Color.BLACK);
复制代码

也可以通过颜色的RGB值设置,a代表透明度。

setARGB(int a, int r, int g, int b)
paint.setColor(Color.rgb(int r, int g, int b));
复制代码

还可以通过十六进制颜色代码直接设置,前两位代表透明度,后边是颜色代码

paint.setColor(0xff123456)
复制代码
canvas

canvas是画布,提供了各种画画的方法。canvas也提供了对canvas缩放、平移、旋转等方法,这样会改变canvas的坐标系,不过在这个例子中我们不需要,只要用默认的坐标系就可以了。

三、我们都能画什么

画个字
//参数1:要画的字符串 参数2:字符串开始的X轴位置 参数3:字符串结束的Y轴位置 参数5:画笔对象
canvas.drawText("字!",0, 0, paint);
复制代码

用canvas画画时,最后一个对象一般都是画笔对象。

画个点
//参数1,2:点的xy坐标
canvas.drawPoint(10, 10, paint);
//参数1:多个点的xy坐标,最后不是两个一组的话就忽略
canvas.drawPoints(new float[]{10,10,20,20,30,30}, paint);
复制代码
画条线
//参数1,2:起点的坐标 参数3,4:终点的坐标
canvas.drawLine(100, 100, 200, 200, paint); 
//参数1:多条线的坐标,4个一组是一条线,最后不够4个就忽略
canvas.drawLines(new float[]{10,10,20,20,30,30},paint);
复制代码
画个矩形
canvas.drawRect(100,100, 200, 200, p);
复制代码

参数分别是矩形的left,top,right,bottom,具体可以看这个图


所以也可以理解为左上角点和右下角点的坐标

想画个多边形或者乱七八糟形

这个可以用path来设置路径实现,我们之后再看一看

画个圆
//参数1,2:圆心的xy坐标 参数3:半径
canvas.drawCircle(100,100,50,paint);
复制代码
画个椭圆
//首先用RectF来定义椭圆再的矩形中,然后绘制
RectF oval = new RectF(150, 200, 500, 400);
canvas.drawOval(oval, p);
复制代码
画个福线
//和椭圆类似,用矩形来画
//参数1:矩形 参数2:开始画的角度 参数3:弧线扫过的角度 参数4:是否和中心连线(true的话就是pizza)
canvas.drawArc(oval, 0, 180, false, p);  
复制代码
直接画个图片吧
//参数1:要画的图片Bitmap 参数2,3 图片左上角点的坐标(没错,就是left和top)
canvas.drawBitmap(bitmap, 200,300, p);
复制代码

四、开始画画

这些就是画画的基础功能,之后就是确定要画的图形的坐标什么的开画,不过在我这幅图中并不是全用了canvas绘制,还用了path来绘制(主要为了画不规则图形方便和贝塞尔曲线),关于path的使用我们之后再分享。


还有一个小细节,关于画出图形还有描边,我是这么画的:由于后边的绘制代码会覆盖之前画好的图形所以思路是准备两个画笔,一个先画出图形,里边填充颜色,然后用第二个画笔只画出边。画画的时候先用第一个笔画完在用第二只笔花同样的图形

paint.setStyle(Paint.Style.FILL);
pLine.setColor(Color.BLACK);
pLine.setStyle(Paint.Style.STROKE);
复制代码

那顺便也分享一下我用的颜色代码吧。

身体蓝:#0bb0da 鼻子和项圈红:#CD0000 铃铛黄:#FFD700 铃铛里的一小块灰:#878787

这样就O了个k-means聚类K

//作为Android开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。希望与大家一同进步