paint

Paint  API 大致可以分为 4 类:

1.颜色   

  *1 setColor(int color)

  *2 setARGB(int a, int r, int g, int b) 三原色(0-255)与透明度的值

   *3 setShader(Shader shader) 设置 Shader

    使用子类 (1) LinearGradient 线性渐变:

LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tileMode)

参数: 

x0 y0 x1 y1:渐变的两个端点的位置 

color0 color1 是端点的颜色 

tileMode:端点范围之外的着色规则,

CLAMP (夹子模式???算了这个词我不会翻)会在端点之外延续端点处的颜色;

MIRROR是镜像模式;

REPEAT 是重复模式。具体的看一下例子就明白。

                   (2)RadialGradient 辐射渐变 从中心向周围辐射状的渐变

RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)

centerX centerY:辐射中心的坐标 
radius:辐射半径 
centerColor:辐射中心的颜色 
edgeColor:辐射边缘的颜色 
tileMode:辐射范围之外的着色模式(同上tileMode)。

                3SweepGradient 扫描渐变

SweepGradient(float cx, float cy, int color0, int color1)

参数: 
cx cy 
:扫描的中心 
color0
:扫描的起始颜色 
color1
:扫描的终止颜色

                 (4)BitmapShader

BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)

参数: 
bitmap:用来做模板的 Bitmap 对象 
tileX:横向的 TileMode 
tileY:纵向的 TileMode

tileMode:辐射范围之外的着色模式(同上tileMode)。

  【小知识】实现圆形图片

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.batman);  

Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);  

paint.setShader(shader);

canvas.drawCircle(300, 300, 200, paint); 

                5ComposeShader 混合着色器 两个 Shader 一起使用。

ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)

shaderA, shaderB:两个相继使用的 Shader 

mode: 两个 Shader 的叠加模式,即 shaderA  shaderB 应该怎样共同绘制。它的类型是 PorterDuff.Mode 

  1. Alpha 合成 (Alpha Compositing)
  2. 混合 (Blending)


PorterDuff.Mode: SRC_OVER,把源图像直接铺在目标图像上

PorterDuff.Mode.DST_OUT 在目标图像上挖出源图像效果

PorterDuff.Mode.DST_IN在目标图像上抠出源图像效果 等。https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

      *4 setColorFilter(ColorFilter colorFilter)

colorFilter 为绘制设置颜色过滤。颜色过滤的意思

         (1) LightingColorFilter  用来模拟简单的光照效果

 LightingColorFilter(int mul, int add)   

参数里的 mul  add 都是和颜色值格式相同的 int 值,其中 mul 用来和目标像素相乘,add 用来和目标像素相加:   R' = R * mul.R / 0xff + add.R  

                     G' = G * mul.G / 0xff + add.G  

                     B' = B * mul.B / 0xff + add.B  

一个「保持原样」的「基本 LightingColorFilter 」,mul  0xffffffadd  0x000000(也就是0

去掉原像素中的红色,可以把它的 mul 改为 0x00ffff (红色部分为 0  


         (2) PorterDuffColorFilter 使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成

        PorterDuffColorFilter(int color, PorterDuff.Mode mode)

         color 参数是指定的颜色

        mode 参数是指定的 Mode(只能指定一种颜色作为源,不是bitmap)

         (3) ColorMatrixColorFilter

使用一个 ColorMatrix 来对颜色进行处理。 ColorMatrix这个类,内部是一个 4x5 的矩阵:

[ a, b, c, d, e,

  f, g, h, i, j,

  k, l, m, n, o,

  p, q, r, s, t ]

 ColorMatrix 可以把要绘制的像素进行转换。对于颜色 [R, G, B, A] ,转换算法是这样的:

R’ = a*R + b*G + c*B + d*A + e;  

G’ = f*R + g*G + h*B + i*A + j;  

B’ = k*R + l*G + m*B + n*A + o;  

A’ = p*R + q*G + r*B + s*A + t;

setSaturation(float sat) 来设置饱和度;

demohttps://github.com/chengdazhi/StyleImageView

     *5. setXfermode(Xfermode xfermode)

以绘制的内容作为源图像 以 View 中已有的内容作为目标图像,选取一个 PorterDuff.Mode 作为绘制内容的颜色处理方案

1 使用离屏缓冲(Off-screen Buffer

通过使用离屏缓冲,把要绘制的内容单独绘制在缓冲层, Xfermode 的使用就不会出现奇怪的结果了

canvas.drawBitmap(rectBitmap, 0, 0, paint); // 画方

paint.setXfermode(xfermode); // 设置 Xfermode

canvas.drawBitmap(circleBitmap, 0, 0, paint); // 画圆

paint.setXfermode(null); // 用完及时清除 Xfermode

2 控制好透明区域

注意控制它的透明区域不要太小,要让它足够覆盖到要和它结合绘制的内容,否则得到的结果很可能不是你想要的


2.效果

*1.setAntiAlias (boolean aa) 设置抗锯齿

抗锯齿默认是关闭的 打开方式 1.setAntiAlias(aa)

                                                 2.实例化  new Paint(Paint.ANTI_ALIAS_FLAG);  

*2. setStyle(Paint.Style style)

用来设置图形是线条风格还是填充风格的

             FILL,是填充模式,默认模式

            STROKE 是画线模式(即勾边模式)

            FILL_AND_STROKE 是两种模式一并使用:既画线又填充。

          在 STROKE  FILL_AND_STROKE 下,还可以使用 paint.setStrokeWidth(float width) 来设置线条的宽度:

*3.线条形状

 4 个方法:

setStrokeWidth(float width)

线条宽度 0表示1像素  1表示2像素 2表示4像素

setStrokeCap(Paint.Cap cap)

设置线头的形状。

线头形状有三种:BUTT 平头(无头)、ROUND 圆头、SQUARE 方头(有一个正方形的头)。默认为 BUTT

setStrokeJoin(Paint.Join join)

设置拐角的形状。

有三个值可以选择:MITER 尖角、 BEVEL 平角和 ROUND 圆角。默认为 MITER

 setStrokeMiter(float miter)

当线条拐角为 MITER 时,拐角处的外缘需要使用延长线来补偿: MITER 型连接点有一个额外的规则:当尖角过长时,自动改用 BEVEL 的方式来渲染连接点

miter=1 / sin ( 角度 / 2 ) 

  *4.色彩优化(图片)

1 setDither(boolean dither)设置图像的抖动。

   两个色彩相交形成的颜色 过于清晰时会看到 两个色彩小颗粒 设置setDithertrue)让图像的抖动显示相交色

2setFilterBitmap(boolean filter)设置是否使用双线性过滤来绘制 Bitmap 

图像在放大绘制,出现马赛克现象;开启了双线性过滤,可以让结果图像显得更加平滑paint.setFilterBitmap(true); 

 *5 setPathEffect(PathEffect effect)

图形的轮廓设置效果

PathEffect分为两类,

单一效果的 CornerPathEffect    作用:把所有拐角变成圆角。

                  CornerPathEffect(float radius) 的参数 radius 是圆角的半径 

                  DiscretePathEffect   作用:把线条进行随机的偏离,让轮廓变得乱七八糟。乱七八糟的方式和程度由参数决定。 

                  DiscretePathEffect(float segmentLength, float deviation) 的两个参数中, segmentLength 是用来拼接的每个线段的长度, deviation 是偏离量

                  DashPathEffect  使用虚线来绘制线条。DashPathEffect(float[] intervals, float phase) 中, 第一个参数 intervals 是一个数组,数组中元素必须为偶数(最少是 2 个),按 画线长度、空白长度的顺序排列;第二个参数 phase 是虚线的偏移量。

                  PathDashPathEffect  用图形链接成的线绘制线条

                 PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style)   shape 参数是用来绘制的 Path(图形) 

    advance 是两个相邻的 shape 段之间的间隔(shape起点和起点的间隔) 

   phase  DashPathEffect 中一样,是虚线的偏移

   style 的类型为 PathDashPathEffect.Style

                TRANSLATE:位移 

                 ROTATE:旋转 图形旋转

                MORPH:变体  图形旋转 并且和拐角 依照位置图形变动


组合效果的 SumPathEffect  分别按照两种 PathEffect 分别对目标进行绘制

                  ComposePathEffect 先对目标 Path 使用一个 PathEffect,然后再对这个改变后的 Path 使用另一个 PathEffect

*6 setShadowLayer(float radius, float dx, float dy, int shadowColor)在之后的绘制内容下面加一层阴影。 radius 是阴影的模糊范围; dx dy 是阴影的偏移量; shadowColor 是阴影的颜色。

清除阴影层,使用 clearShadowLayer() 

注意:

     在硬件加速开启的情况下, setShadowLayer() 只支持文字的绘制,文字之外的绘制必须关闭硬件加速才能正常绘制阴影。

     如果 shadowColor 是半透明的,阴影的透明度就使用 shadowColor 自己的透明度;而如果 shadowColor 是不透明的,阴影的透明度就使用 paint 的透明度。

*7 setMaskFilter(MaskFilter maskfilter)

上一个方法 setShadowLayer() 是设置的在绘制层下方的附加效果;而这个 MaskFilter 和它相反,设置的是在绘制层上方的附加效果。

MaskFilter 有两种:

 BlurMaskFilter  

模糊效果的 MaskFilter

   NORMAL: 内外都模糊绘制

         SOLID: 内部正常绘制,外部模糊

         INNER: 内部模糊,外部不绘制

          OUTER: 内部不绘制,外部模糊(什么鬼?)

 EmbossMaskFilter

浮雕效果的 MaskFilter

EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)

direction 是一个 3 个元素的数组,指定了光源的方向; ambient 是环境光的强度,数值范围是 0 1 specular 是炫光的系数; blurRadius 是应用光线的范围

*8  获取绘制的 Path

getFillPath(Path src, Path dst)

Path ,指的就是 drawPath() 的绘制内容的轮廓,要算上线条宽度和设置的 PathEffect

??????

getTextPath(String text, int start, int end, float x, float y, Path path) / getTextPath(char[] text, int index, int count, float x, float y, Path path)

文字的绘制  获取的就是目标文字所对应的 Path

       3.drawText() 相关

下一节里单独讲。

初始化

1 reset()

重置 Paint 的所有属性为默认值。相当于重新 new 一个

2 set(Paint src)

 src 的所有属性全部复制过来。相当于调用 src 所有的 get 方法,然后调用这个 Paint 的对应的 set 方法来设置它们。

3 setFlags(int flags)

批量设置 flags。相当于依次调用它们的 set 方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值