Android Paint类
1. Paint常用方法
-
setColor(int)
,设置画笔的颜色 -
setAlpha(int)
,设置画笔的透明度 -
setARGB(int a, int r, int g, int b)
,设置画笔的颜色,a
代表透明度,r
,g
,b
代表颜色值 -
setAntiAlias(boolean)
,设置是否使用抗锯齿功能,设置后会平滑一些 -
setDither(boolean)
,设定是否使用图像抖动处理,设置后图像更加清晰 -
setStyle(Style)
,设置画笔的风格-
Style.FILL
,实心 -
Style.FILL_AND_STROKE
,同时显示实心和空心 -
Style.STROKE
,空心
示例代码
mRedPaint = new Paint(); mRedPaint.setColor(Color.RED); mRedPaint.setStyle(Paint.Style.STROKE); canvas.drawLine(50, 50, 400, 50, mRedPaint); mRedPaint.setAlpha(100); canvas.drawLine(50, 100, 400, 100, mRedPaint); mRedPaint.setARGB(10, 255, 0, 0); canvas.drawLine(50, 150, 400, 150, mRedPaint); mRedPaint.setColor(Color.RED); mRedPaint.setStyle(Paint.Style.STROKE); canvas.drawCircle(150, 300, 75, mRedPaint); mRedPaint.setStyle(Paint.Style.FILL); canvas.drawCircle(150, 500, 75, mRedPaint); mRedPaint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawCircle(150, 700, 75, mRedPaint);
效果如下
-
-
setStrokeWidth(int)
,设置线宽 -
setStrokeCap(Cap)
,设置线帽 -
setStrokeJoin(Join)
,设置连接示例代码
mRedPaint.setStrokeWidth(5); mRedPaint.setStrokeCap(Paint.Cap.BUTT); canvas.drawLine(50, 50, 400, 50, mRedPaint); mRedPaint.setStrokeWidth(20); canvas.drawLine(50, 100, 400, 100, mRedPaint); mRedPaint.setStrokeCap(Paint.Cap.ROUND); canvas.drawLine(50, 150, 400, 150, mRedPaint); mRedPaint.setStrokeCap(Paint.Cap.SQUARE); canvas.drawLine(50, 200, 400, 200, mRedPaint); mRedPaint.setStrokeCap(Paint.Cap.ROUND); mRedPaint.setStrokeJoin(Paint.Join.MITER); canvas.drawRect(50, 250, 400, 400, mRedPaint); mRedPaint.setStrokeJoin(Paint.Join.ROUND); canvas.drawRect(50, 450, 400, 600, mRedPaint); mRedPaint.setStrokeJoin(Paint.Join.BEVEL); canvas.drawRect(50, 650, 400, 800, mRedPaint);
效果如下
-
setTextSize(int)
,设置字体大小 -
setFakeBoldText(boolean)
,设置文本仿粗体 -
setUnderlineText(boolean)
,设置文字的下划线 -
setTextSkewX(float)
,设置斜体字,值为负右倾值为正左倾 -
setStrikeThruText(boolean)
,设置文本删除线 -
setTextScaleX(float)
,文本沿X轴水平缩放,默认值为1 -
setLetterSpacing(float)
,设置行的间距 -
setShadowLayer(float radius, float dx, float dy, int shadowColor)
,设置阴影效果,radius
为阴影角度,dx
和dy
为阴影在x轴和y轴上的距离,color
为阴影的颜色 -
setTypeface(Typeface)
,设置文本字体样式 -
setTextAlign(Paint.Align)
,设置字体方向示例代码
final String text = "This is a text"; mRedPaint.setTextSize(50); canvas.drawText(text, 50, 80, mRedPaint); Paint paint = new Paint(mRedPaint); paint.setTextSize(30); canvas.drawText(text, 50, 120, paint); paint = new Paint(mRedPaint); paint.setFakeBoldText(true); // 设置文本仿粗体 canvas.drawText(text, 50, 180, paint); paint = new Paint(mRedPaint); paint.setUnderlineText(true); // 设置文字的下划线 canvas.drawText(text, 50, 240, paint); paint = new Paint(mRedPaint); paint.setTextSkewX(-0.25f); // 设置斜体字,值为负右倾值为正左倾 canvas.drawText(text, 50, 300, paint); paint.setTextSkewX(0.25f); canvas.drawText(text, 50, 360, paint); paint = new Paint(mRedPaint); paint.setStrikeThruText(true); // 设置文本删除线 canvas.drawText(text, 50, 420, paint); paint = new Paint(mRedPaint); paint.setTextScaleX(2); // 文本沿X轴水平缩放,默认值为1 canvas.drawText(text, 50, 480, paint); paint = new Paint(mRedPaint); paint.setLetterSpacing(0.1f); // 设置行的间距 canvas.drawText(text, 50, 540, paint); paint = new Paint(mRedPaint); paint.setShadowLayer(5, 5, 5, Color.BLACK); canvas.drawText(text, 50, 600, paint); paint = new Paint(mRedPaint); paint.setTypeface(typeface); // 设置文本字体样式 canvas.drawText(text, 50, 660, paint); paint = new Paint(mRedPaint); paint.setTextAlign(Paint.Align.LEFT); canvas.drawText(text, 400, 720, paint); paint.setTextAlign(Paint.Align.RIGHT); canvas.drawText(text, 400, 780, paint); paint.setTextAlign(Paint.Align.CENTER); canvas.drawText(text, 400, 840, paint); paint.setStrokeWidth(5); canvas.drawLine(400, 660, 400, 860, paint);
效果如下
2. setXfermode(Xfermode)方法
PorterDuffXfermode
是Xfermode
的子类,只有一个含参的构造方法PorterDuffXfermode(PorterDuff.Mode)
,在API DEMO里面Mode
的不同效果
但在实际中,Android为我们提供了18种
常量 | 含义 |
---|---|
ADD | 饱和相加,对图像饱和度进行相加,不常用 |
CLEAR | 清除图像 |
DARKEN | 变暗,较深的颜色覆盖较浅的颜色,若两者深浅程度相同则混合 |
DST | 只显示目标图像 |
DST_ATOP | 在源图像和目标图像相交的地方绘制【目标图像】,在不相交的地方绘制【源图像】,相交处的效果受到源图像和目标图像alpha的影响 |
DST_IN | 只在源图像和目标图像相交的地方绘制【目标图像】,绘制效果受到源图像对应地方透明度影响 |
DST_OUT | 只在源图像和目标图像不相交的地方绘制【目标图像】,在相交的地方根据源图像的alpha进行过滤,源图像完全不透明则完全过滤,完全透明则不过滤 |
DST_OVER | 将目标图像放在源图像上方 |
LIGHTEN | 变亮,与DARKEN相反,DARKEN和LIGHTEN生成的图像结果与Android对颜色值深浅的定义有关 |
MULTIPLY | 正片叠底,源图像素颜色值乘以目标图像素颜色值除以255得到混合后图像像素颜色值 |
OVERLAY | 叠加 |
SCREEN | 滤色,色调均和,保留两个图层中较白的部分,较暗的部分被遮盖 |
SRC | 只显示源图像 |
SRC_ATOP | 在源图像和目标图像相交的地方绘制【源图像】,在不相交的地方绘制【目标图像】,相交处的效果受到源图像和目标图像alpha的影响 |
SRC_IN | 只在源图像和目标图像相交的地方绘制【源图像】 |
SRC_OUT | 只在源图像和目标图像不相交的地方绘制【源图像】,相交的地方根据目标图像的对应地方的alpha进行过滤,目标图像完全不透明则完全过滤,完全透明则不过滤 |
SRC_OVER | 将源图像放在目标图像上方 |
XOR | 在源图像和目标图像相交的地方之外绘制它们,在相交的地方受到对应alpha和色值影响,如果完全不透明则相交处完全不绘制 |
3. setPathEffect(PathEffect)方法
setPathEffect(PathEffect)
方法为Path
设置样式。
-
不设置
mPaint.setAntiAlias(true); mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(2); // 设置样式 mPaint.setPathEffect(null);
效果如下
-
CornerPathEffect
使路径的转角变得圆滑CornerPathEffect(float radius)
// radius指定转角 mPaint.setPathEffect(new CornerPathEffect(25));
效果如下
-
DashPathEffect
设置虚线路径效果DashPathEffect(float intervals[], float phase)
// intervals[]指定虚实线长度,phase指定偏移量 mPaint.setPathEffect(new DashPathEffect(new float[]{20, 5, 10, 5}, mPhase));
效果如下
-
PathDashPathEffect
设置路径填充的样式PathDashPathEffect(Path shape, float advance, float phase, Style style)
// shape定义路径填充的样式,advance是每个图形之间的间距,phase指定偏移量 // style分为ROTATE、MORPH和TRANSLATE Path path = new Path(); path.addCircle(0, 0, 3, Path.Direction.CW); mPaint.setPathEffect(new PathDashPathEffect(path, 12, mPhase, PathDashPathEffect.Style.ROTATE)
效果如下
在onDraw(Canvas)
方法里面修改偏移量mPhase
,DashPathEffect
和PathDashPathEffect
可以产生动态效果mPhase++; invalidate();
效果如下
-
DiscretePathEffect
使得在原来路径的基础上发生打散效果。DiscretePathEffect(float segmentLength, float deviation)
// segmentLength指定最大的段长,deviation则为绘制时的偏离量。 mPaint.setPathEffect(new DiscretePathEffect(3.0f, 5.0f)); mPaint.setPathEffect(new DiscretePathEffect(5.0f, 3.0f));
效果如下
-
ComposePathEffect
是组合效果,会首先将innerpe
变现出来,接着在innerpe
的基础上来增加outerpe
效果 -
SumPathEffect
是叠加效果,在表现时会将两个参数的效果都独立的表现出来, 接着将两个效果简单的重叠在一起显示出来
4. setMaskFilter(MaskFilter)方法
setMaskFilter(MaskFilter)
方法用来对图像进行一定的处理,需要关闭View
的硬件加速功能
setLayerType(LAYER_TYPE_SOFTWARE, null)
-
BlurMaskFilter
为模糊遮罩滤镜BlurMaskFilter(float radius, Blur style)
// radius是阴影范围,style是阴影类型 mPaint.setMaskFilter(null); // NORMAL会将整个图像模糊掉 mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL)); // SOLID在图像边界外产生一层与Paint颜色一致的阴影效果而不影响图像本身 mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID)); // OUTER在边界外产生一层阴影且会将原本的图像变透明 mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.OUTER)); // INNER会在图像内部产生模糊 mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.INNER));
效果如下
-
EmbossMaskFilter
为浮雕遮罩滤镜