Android Paint类

1. Paint常用方法

setColor(int),设置画笔的颜色
setAlpha(int),设置画笔的透明度
setARGB(int a, int r, int g, int b),设置画笔的颜色,a代表透明度,rgb代表颜色值
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为阴影角度,dxdy为阴影在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)方法

PorterDuffXfermodeXfermode的子类,只有一个含参的构造方法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)方法里面修改偏移量mPhaseDashPathEffectPathDashPathEffect可以产生动态效果
    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 Path类
Android Paint类
Android Canvas类

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值