自定义控件是Android系统中一个非常重要的特性,通过自定义控件可以使生硬的界面变得生动活泼。每个应用或多或少都会有几个乃至几十个自定义控件。小编也是深受其害,遇到简单的需求,通过网上找找相关代码,修修改改还能满足,遇到苛刻的老板,完全没有办法,经历过两次的毒打,小编狠下心来,坚持学习,为了以后不再为了自定义而感到怀疑人生。今天是小编学习的第一天,以后会努力坚持一天发布一篇,从0到1。加油!
基本图形的绘制
我们平时画图的时候需要的两个工具,是纸和笔。那么,在Android中,Paint类就是画笔,Canvas类就是纸,在这里叫 做画布。所以,凡是跟画笔设置相关的,比如画笔大小、粗细、画笔颜色、透明度、字体的样式等,都在Paint类里设置:同样,凡是画出成品的东西,比如图形、矩形、文字等,都要调用Canvas类里的函数生成。
下面通过一个自定义控件的例子来学习一下,以及了解Paint和Canvas类的用法。
一般自定义View有一个构造方法:
重写onDraw(Canvas canvas)。可以看到,在该函数中,入参是一个Canvas对象,也就是当前控件的画布,所以只要调用Canvas的绘图函数,效果就可以直接显示在控件上
完整的代码如下:
运行效果:
从这里看到,只需要先创建一个派生自View的类,再重新在onDraw()函数中设置Paint并调用Canvas的一些绘图函数,就可以画出我们想要的图形。由此看来,自定义控件并不复杂。下面来看下如何设置画笔。
画笔的基本设置
1.setColor
void setColor(int color)
一种颜色是由红、绿、蓝三种颜色合成出来的,所以color只能取8位的0xAARRGGBB样式的颜色。
其中:
-
A 代表透明度(Alpha),取值范围是0~255(对应十六进制数0x00~0xFF),取值越小,透明度越高,图像也就越透明。当取 0时,图像完全不可见。
-
R 代表红色值(Red),取值范围是0~255(对应十六进制数0x00~0xFF),取值越小,红色越少。当取0时,表示红色完全不 可见;当取255时,红色完全显示。
-
G 代表绿色值(Green),取值范围是0~255(对应十六进制数0x00~0xFF),取值越小,绿色越少。当取0时,表示绿色完 全不可见;当取255时,绿色完全显示。
- B 代表蓝色值(Blue),取值范围是0~255(对应十六进制数0x00~0xFF),取值越小,蓝色越少。当取0时,表示蓝色完全不 可见;当取255时,蓝色完全显示。
比如0xFFFF0000就表示大红色。因为透明度是255,表示完全不透明,红色取全量值255,其他色值全取0,表示颜色中只有红色;当然,如果我们不需要那么红,则可以适当减少红色值,比如0xFFFFFF00就会显示弱红色。
其实,出手动组合颜色的方法以外,系统还提供了一个专门用来解析颜色的类--Color(有关Color类的使用,后期再进行学习)
下面绘制一大一小两个圆,并将这两个圆叠加起来,上方的圆半透明,代码如下:
Paint paint = new Paint();
paint.setColor(0xFFFF0000);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(50);
canvas.drawCircle(190,200,150,paint);
paint.setColor(0x7EFFFF00);
canvas.drawCircle(190,200,100,paint);
这里绘制了两个圆,第一个圆的颜色值是0xFFFF0000,即不透明的红色,半径取150px;第二个圆的颜色值是0xEFFFF00,即半透明的黄色,半径取100px。效果如下图所示。
2.setStyle
void setStyle(Style style)
该函数用于设置填充样式,对于文字和几何图形都有效。style的取值如下:
- Paint.Style.FILL:仅填充内部。
- Paint.Style.FILL_AND_STROKE:填充内部和描边。
- Paint.Style.STROKE:仅描边。
设置填充内部及描边的样式代码如下:
Paint paint = new Paint();
paint.setColor(0xFFFF0000);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(50);
canvas.drawCircle(190,200,150,paint);
Paint paint = new Paint();
paint.setColor(0xFFFF0000);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setStrokeWidth(50);
canvas.drawCircle(190,200,150,paint);
Paint paint = new Paint();
paint.setColor(0xFFFF0000);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(50);
canvas.drawCircle(190,200,150,paint);
各自效果图如下:
明显可见,FILL_AND_STROKE是FILL和STROKE叠加在一起显示的结果,FILL_AND_STROKE比FILL多了一个描边的宽度。
3. setCrokeWide()
void setStrokeWidth(float width)
用于设置描边宽度 值,单位是px。当画笔的Style样式是STROKE、FILL_AND_STROKE时有效。
今天小编就学习到这了,一边学习,一边写文章,还是有点效果,希望每天都能坚持下来。坚持一天一篇。