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是叠加效果,在表现时会将两个参数的效果都独立的表现出来, 接着将两个效果简单的重叠在一起显示出来
有些设备给paint设置DashPathEffect没有效果,解决方法就是,在view层关闭硬件加速,直接在自定义View的构造方法中调用:
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
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为浮雕遮罩滤镜

本文深入探讨了Android中Paint类的各种属性和方法,包括颜色、透明度、风格设置,以及如何通过设置画笔实现复杂的视觉效果。从基础的线条绘制到高级的路径效果,全面解析Paint在Android开发中的应用。
199

被折叠的 条评论
为什么被折叠?



