前文介绍了Paint和Canvas的一些常用方法,这里就主要介绍一下Paint的不太常用但是做一些效果又必须用到的,姑且就叫 Paint进阶。
· 阴影
Paint提供了设置阴影的功能。并提供了一系列的方法来操作阴影。
设置阴影 void setShadowLayer(float radius, float dx, float dy, int shadowColor)
清除阴影 void clearShadowLayer()
是否有阴影 boolean hasShadowLayer()
setShadowLayer 提供了四个参数用来设置阴影的颜色,偏移度及角度(我更愿意叫模糊度)
radius:模糊度 (数值越大越模糊,当为0时,不显示)
dx:水平位移
dy:垂直位移
shadowColor:颜色
mPaintText.setShadowLayer(10, 15, 15, Color.parseColor("#87CEFA"));
canvas.drawText("欢迎光临阿东的博客", 100, 300, mPaintText);
mPaintText.setShadowLayer(2, 15, 15, Color.parseColor("#87CEFA"));
canvas.drawText("欢迎光临阿东的博客", 100, 400, mPaintText);
mPaintText.setShadowLayer(0, 15, 15, Color.parseColor("#87CEFA"));
canvas.drawText("欢迎光临阿东的博客", 100, 500, mPaintText);
mPaintLine.setShadowLayer(10, 15, 15, Color.parseColor("#87CEFA"));
canvas.drawCircle(300, 700, 100,mPaintLine);
先看文字部分。当radius 越小 阴影越清晰,当radius为0时,阴影不显示。让我们看一下官方的解释
This draws a shadow layer below the main layer, with the specified offset and color, and blur radius. If radius is 0, then the shadow layer is removed.
其实就是在我们正常的文字下面加了一个图层,当radius为0的时候,移除图层。
再看下面的圆形,发现并没有画出阴影,这是因为setShadowLayer 方法在硬件加速开启与否的情况下,显示的是不一样的(硬件加速开启,执行的是另一套绘制流程,这个了解即可),在硬件加速开启的情况下,只有drawText支持。我们需要知道,自从Android4.0以后,硬件加速是默认开启的(现在网上的大部分资料都在说,需要手动开启硬件加速,是不对的。过时了)。那我们只需要关闭即可。
在view中调用 setLayerType(View.LAYER_TYPE_SOFTWARE, null)
在来看一下效果
· 线帽 (这个词总感觉怪怪的,原谅我这蹩脚的翻译)
StrokeCap,字面意思线帽,就是给线的两端加了个帽子,我们可以指定形状(当然,只能用Paint中定义好的三种)
Paint.Cap.BUTT 没有
Paint.Cap.ROUND 圆形
Paint.Cap.SQUARE 方形
mPaintLine.setStrokeWidth(50);
mPaintLine.setStrokeCap(Paint.Cap.BUTT);
canvas.drawLine(100, 100, 500, 100, mPaintLine);
mPaintLine.setStrokeCap(Paint.Cap.ROUND);
canvas.drawLine(100, 200, 500, 200, mPaintLine);
mPaintLine.setStrokeCap(Paint.Cap.SQUARE);
canvas.drawLine(100, 300, 500, 300, mPaintLine);
· 连接线
StrokeJoin,用来设置连接处的样式,Paint中提供了三种选择
Paint.Join.BEVEL 斜边
Paint.Join.MITER 锐角
Paint.Join.ROUND 圆角
mPaintLine.setStrokeJoin(Paint.Join.BEVEL);
canvas.drawRect(100, 100, 400, 400, mPaintLine);
canvas.drawText("Paint.Join.BEVEL", 500, 400, mPaintText);
mPaintLine.setStrokeJoin(Paint.Join.MITER);
canvas.drawRect(100, 500, 400, 800, mPaintLine);
canvas.drawText("Paint.Join.MITER", 500, 800, mPaintText);
mPaintLine.setStrokeJoin(Paint.Join.ROUND);
canvas.drawRect(100, 900, 400, 1200, mPaintLine);
canvas.drawText("Paint.Join.ROUND", 500, 1200, mPaintText);
当然我图上举的例子是矩形,这个可以应用到所有线条连接处。
作为Android绘图最常用的工具类,Paint还有许多其他的用法,但是大部分都需要跟别的类联合使用,之后会为大家一一讲解。