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);
    

    效果如下
    Android Paint类

  • 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);
    

    效果如下
    Android Paint类

  • 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);
    

    效果如下
    Android Paint类

2. setXfermode(Xfermode)方法

PorterDuffXfermodeXfermode的子类,只有一个含参的构造方法PorterDuffXfermode(PorterDuff.Mode),在API DEMO里面Mode的不同效果
Android Paint类
但在实际中,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); 
    

    效果如下
    Android Paint类

  • CornerPathEffect使路径的转角变得圆滑

    CornerPathEffect(float radius)

      // radius指定转角        
      mPaint.setPathEffect(new CornerPathEffect(25));
    

    效果如下
    Android Paint类

  • DashPathEffect设置虚线路径效果

    DashPathEffect(float intervals[], float phase)

      // intervals[]指定虚实线长度,phase指定偏移量    
      mPaint.setPathEffect(new DashPathEffect(new float[]{20, 5, 10, 5}, mPhase));
    

    效果如下
    Android Paint类

  • 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)
    

    效果如下
    Android Paint类
    onDraw(Canvas)方法里面修改偏移量mPhaseDashPathEffectPathDashPathEffect可以产生动态效果

      mPhase++;
      invalidate();
    

    效果如下
    Android Paint类

  • DiscretePathEffect使得在原来路径的基础上发生打散效果。

    DiscretePathEffect(float segmentLength, float deviation)

      // segmentLength指定最大的段长,deviation则为绘制时的偏离量。
      mPaint.setPathEffect(new DiscretePathEffect(3.0f, 5.0f));
      mPaint.setPathEffect(new DiscretePathEffect(5.0f, 3.0f));
    

    效果如下
    Android Paint类

  • 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));
    

    效果如下
    Android Paint类

  • EmbossMaskFilter为浮雕遮罩滤镜

相关文章
Android Path类
Android Paint类
Android Canvas类