Android自定义View系列之画笔(一)

1.先介绍画笔的三种形式 (Style,StrokeCap,StrokeJoin)图如下

2.画笔的具体API使用

(一)图形绘制   

1) 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。 
   setARGB(int a,int r,int g,int b);

2) 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
   setAntiAlias(boolean aa);

3) 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰 
   setDither(boolean dither);

4) 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果
   setColorFilter(ColorFilter colorfilter);

5) 设置绘制图形的透明度
   setAlpha(int a);   
   
6) 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色
   setColor(int color);   
 
7) 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示   
   速度,本设置项依赖于dither和xfermode的设置   
   setFilterBitmap(boolean filter);   
    
8) 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE 
   setStyle(Paint.Style style);   
      
9) 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式   
   Cap.ROUND,或方形样式Cap.SQUARE        
   setStrokeCap(Paint.Cap cap);   
      
10) 设置绘制时各图形的结合方式,如平滑效果等  
    setSrokeJoin(Paint.Join join);   

11) 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度    
    setStrokeWidth(float width);   

     
(二)文本绘制

1) 模拟实现粗体文字,设置在小字体上效果会非常差 
   setFakeBoldText(boolean fakeBoldText);
   
2) 设置该项为true,将有助于文本在LCD屏幕上的显示效果 是对文本的一种优化设置,
   可以让文字看起来更加清晰明显,可以参考一下PC端的控制面板-外观和个性化-调整ClearType文本  
   setSubpixelText(boolean subpixelText);   

3) 设置绘制文字的对齐方向 
   setTextAlign(Paint.Align align);

4) 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果 
   setTextScaleX(float scaleX); 

5) 设置绘制文字的字号大小
   setTextSize(float textSize); 

6) 设置斜体文字,skewX为倾斜弧度   
   setTextSkewX(float skewX); 

7) 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等
   setTypeface(Typeface typeface);

8) 设置带有下划线的文字效果
   setUnderlineText(boolean underlineText); 

9) 设置带有删除线的效果    
   setStrikeThruText(boolean strikeThruText);    

10) 这个是文本缓存,设置线性文本,如果设置为true就不需要缓存,
    setLinearText(boolean linearText)


11) 设置字体样式,可以是Typeface设置的样式,也可以通过Typeface的createFromAsset(AssetManager mgr, String path)方法加载样式
    setTypeface(Typeface typeface)


12) 设置字体样式,可以设置CSS样式
    setFontFeatureSettings(String settings)

(三)辅助性的api

1) 重置Paint。
   reset()

2) 设置一些标志,比如抗锯齿,下划线等等。
   setFlags(int flags)

3) 设置行的间距,默认值是0,负值行间距会收缩
   setLetterSpacing(float letterSpacing)


(四)复杂的api

1)设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 
   setMaskFilter(MaskFilter maskfilter)

   MaskFilter类可以为Paint分配边缘效果。
   对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter:
   BlurMaskFilter   指定了一个模糊的样式和半径来处理Paint的边缘。
   EmbossMaskFilter  指定了光源的方向和环境光强度来添加浮雕效果。
   要应用一个MaskFilter,可以使用setMaskFilter方法,并传递给它一个MaskFilter对象。
   下面的例子是对一个已经存在的Paint应用一个EmbossMaskFilter:

      // 设置光源的方向
      float[] direction = new float[]{ 1, 1, 1 };
      //设置环境光亮度
      float light = 0.4f;
      // 选择要应用的反射等级
      float specular = 6;
     // 向mask应用一定级别的模糊
       float blur = 3.5f;
     EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);
     // 应用mask 
      myPaint.setMaskFilter(emboss);

2)设置绘制路径的效果,如点画线等
   setPathEffect(PathEffect effect);
 
  PathEffect是用来控制绘制轮廓(线条)的方式。PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。
  使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect,包括:
    1)CornerPathEffect  可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。
    2)DashPathEffect  可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。
    3) DiscretePathEffect  与DashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。
    4)PathDashPathEffect  这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。
  下面的效果可以在一个Paint中组合使用多个Path Effect。
    1)SumPathEffect  顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。
    2)ComposePathEffect  将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。
  对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。
  使用setPathEffect方法可以把PathEffect应用到Paint对象中,如下所示:
      paint.setPathEffect(new CornerPathEffect(10));

3)设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果
   setXfermode(Xfermode xfermode);   
  
  橡皮擦,这是个好方法啊,看看。
  可以通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式。
  在正常的情况下,在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。下面的Xfermode子类可以改变这种行为:
    1)AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
    2)PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。
     3)PorterDuffXfermode  这是一个非常强大的转换模式,使用它,
           可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
  要应用转换模式,可以使用setXferMode方法,如下所示: 
       AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); 
       borderPen.setXfermode(avoid);
  这里可以实现完美的橡皮擦功能!代码异常简单:
  Xfermode xFermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
  paint.setXfermode(xFermode);

  PorterDuff.Mode为枚举类,一共有16个枚举值:
    1.PorterDuff.Mode.CLEAR  
      所绘制不会提交到画布上。
    2.PorterDuff.Mode.SRC
       显示上层绘制图片
    3.PorterDuff.Mode.DST
      显示下层绘制图片
    4.PorterDuff.Mode.SRC_OVER
      正常绘制显示,上下层绘制叠盖。
    5.PorterDuff.Mode.DST_OVER
      上下层都显示。下层居上显示。
    6.PorterDuff.Mode.SRC_IN
       取两层绘制交集。显示上层。
    7.PorterDuff.Mode.DST_IN
      取两层绘制交集。显示下层。
    8.PorterDuff.Mode.SRC_OUT
     取上层绘制非交集部分。
    9.PorterDuff.Mode.DST_OUT
     取下层绘制非交集部分。
    10.PorterDuff.Mode.SRC_ATOP
     取下层非交集部分与上层交集部分
    11.PorterDuff.Mode.DST_ATOP
     取上层非交集部分与下层交集部分
    12.PorterDuff.Mode.XOR
      异或:去除两图层交集部分
    13.PorterDuff.Mode.DARKEN
      取两图层全部区域,交集部分颜色加深
    14.PorterDuff.Mode.LIGHTEN
      取两图层全部,点亮交集部分颜色
    15.PorterDuff.Mode.MULTIPLY
      取两图层交集部分叠加后颜色
    16.PorterDuff.Mode.SCREEN
      取两图层全部区域,交集部分变为透明色

4)设置渐变渲染

  设置图像效果,使用Shader可以绘制出各种渐变效果;
  Shader下面有五个子类可用:
    BitmapShader :位图图像渲染
    LinearGradient:线性渲染
    RadialGradient:环形渲染
    SweepGradient:扫描渐变渲染/梯度渲染
    ComposeGradient:组合渲染,可以和其他几个子类组合起来使用
   这几个类中LinearGradient、RadialGradient、SweepGradient均是可以将颜色进行处理,形成柔和的过渡,也可以称为渐变,而BitmapShader 则是直接使用位图进行渲染,就类似于贴图,在贴图的过程中根据需要自然就可以选择相应的模式,有三种模式可供选择,分别是枚举:
 
    emun Shader.TileMode 定义了平铺的3种模式: 
    static final Shader.TileMode CLAMP: 边缘拉伸,即使用边缘的最后一个像素进行延展;
    static final Shader.TileMode MIRROR:在水平方向和垂直方向交替景象, 两个相邻图像间没有缝隙,从名称上看就像照镜子一样;
    Static final Shader.TillMode REPETA:在水平方向和垂直方向重复摆放,两个相邻图像间有缝隙缝隙;
   
     

 1.颜色渐变渲染:
   LinearGradient有两个构造函数;
     public LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions,Shader.TileMode tile) 
    参数:
    float x0: 渐变起始点x坐标
    float y0:渐变起始点y坐标
    float x1:渐变结束点x坐标
    float y1:渐变结束点y坐标
    int[] colors:颜色 的int 数组
    float[] positions: 相对位置的颜色数组,可为null,  若为null,可为null,颜色沿渐变线均匀分布
    Shader.TileMode tile: 渲染器平铺模式

    public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1,Shader.TileMode tile)
    float x0: 渐变起始点x坐标
    float y0:渐变起始点y坐标
    float x1:渐变结束点x坐标
    float y1:渐变结束点y坐标
    int color0: 起始渐变色
    int color1: 结束渐变色
    Shader.TileMode tile: 渲染器平铺模式
   

 2.位图图像渲染
     public BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY)
    调用这个方法来产生一个画有一个位图的渲染器(Shader)。
    bitmap   在渲染器内使用的位图    
    tileX    在位图上X方向渲染器平铺模式
    tileY    在位图上Y方向渲染器平铺模式
    TileMode:
    CLAMP  :如果渲染器超出原始边界范围,会复制范围内边缘染色。
    REPEAT :横向和纵向的重复渲染器图片,平铺。
    MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT重复方式不一样,他是以镜像方式平铺。

 3.环形渲染
      public RadialGradient(float x, float y, float radius, int[] colors, float[] positions,Shader.TileMode tile)
    float x:  圆心X坐标
    float y:  圆心Y坐标
    float radius: 半径
    int[] colors:  渲染颜色数组
    floate[] positions: 相对位置数组,可为null,  若为null,可为null,颜色沿渐变线均匀分布
    Shader.TileMode tile:渲染器平铺模式

      public RadialGradient(float x, float y, float radius, int color0, int color1,Shader.TileMode tile)
    float x:  圆心X坐标
    float y:  圆心Y坐标
    float radius: 半径
    int color0: 圆心颜色
    int color1: 圆边缘颜色
    Shader.TileMode tile:渲染器平铺模式

 4.扫描渐变渲染/梯度渲染
      public SweepGradient(float cx, float cy, int[] colors, float[] positions)
    cx    渲染中心点x 坐标
    cy    渲染中心y 点坐标
    colors    围绕中心渲染的颜色数组,至少要有两种颜色值
    positions    相对位置的颜色数组,可为null,  若为null,可为null,颜色沿渐变线均匀分布

      public SweepGradient(float cx, float cy, int color0, int color1)
    cx    渲染中心点x 坐标
    cy    渲染中心点y 坐标
    color0    起始渲染颜色
    color1    结束渲染颜色

 5.组合渲染
   public ComposeShader(Shader shaderA,Shader shaderB, Xfermode mode)
    shaderA    渲染器A,Shader及其子类对象
    shaderB    渲染器B,Shader及其子类对象
    mode     两种渲染器组合的模式,Xfermode对象

   public ComposeShader(Shader shaderA,Shader shaderB, PorterDuff.Mode mode)
    shaderA    渲染器A,Shader及其子类对象
    shaderB    渲染器B,Shader及其子类对象
     mode    两种渲染器组合的模式,ProterDuff.Mode对象

猜你喜欢

转载自blog.csdn.net/qq_33429583/article/details/86544607