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对象

android画笔,Android自定义View系列之画笔(一)相关推荐

  1. Android仿IOS解锁密码界面-自定义view系列(6)

    Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...

  2. Android安卓仿IOS音量调节-自定义view系列(4)

    Android安卓仿IOS音量调节-自定义view系列 功能简介 主要实现步骤 xml相关属性设置 java代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击查看 Gi ...

  3. Android仿IOS滑动关机-自定义view系列(6)

    Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...

  4. Android中的自定义View以及绘图工具

    1.1自定义view的简介 为什么要使用自定义view 在Android开发中有很多业务场景,原生的控件是无法满足应用,并且经常也会遇到一个UI在多处 重复使用情况,那么就需要通过自定义View的方式 ...

  5. Android进阶之自定义View实战(二)九宫格手势解锁实现

    一.引言 在上篇博客Android进阶之自定义View实战(一)仿iOS UISwitch控件实现中我们主要介绍了自定义View的最基本的实现方法.作为自定义View的入门篇,仅仅介绍了Canvas的 ...

  6. android标尺自定义view,android尺子的自定义view——RulerView详解

    项目中用到自定义尺子的样式: 原效果为 因为跟自己要使用的view稍有不同 所以做了一些修改,修改的注释都放在代码中了,特此记录一下. 首先是一个自定义View: public class RuleV ...

  7. wing带你玩转自定义view系列(3)模仿微信下拉眼睛

    发现了爱神的自定义view系列,我只想说一个字:凸(艹皿艹 ) !!相见恨晚啊,早看到就不会走这么多弯路了 另外相比之下我这完全是小儿科..所以不说了,这篇是本系列完结篇....我要从零开始跟随爱哥脚 ...

  8. android绘制心形_Android自定义View系列(一)——打造一个爱心进度条

    写作原因:Android进阶过程中有一个绕不开的话题--自定义View.这一块是安卓程序员更好地实现功能自主化必须迈出的一步.下面这个系列博主将通过实现几个例子来认识安卓自定义View的方法.从自定义 ...

  9. Android自定义View系列之进度指示控件

    我开通微信公众号啦,如果大家喜欢我的文章,欢迎大家关注我的微信号,我会定期为大家推送Android中的热门知识. 今天为大家介绍另一个自定义View--进度指示器,这个在电商App和支付宝等中经常遇到 ...

最新文章

  1. Linux 系统的备份恢复
  2. AndroidStudio中Attatch debugger to Android Ptocess时 Choose Process后OK是灰色的
  3. life at University of Liverpool
  4. [云炬python3玩转机器学习笔记] 2-5机器学习相关的哲学思考
  5. A Simple Problem with Integers POJ - 3468 (线段树)
  6. Android 为View实现双击效果
  7. 红帽RHCE培训-课程3笔记内容2
  8. 9模块化学习 java_Java 9模块
  9. k8s dashboard_ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard
  10. 在ArcScene中导入显示自己在SketchUp创建并经过修饰的模型
  11. 新手搭建一个网站(详细完整版)
  12. RuntimeError CUDA environment is not correctly set up
  13. 虾皮铺货应该注意什么?
  14. wps教程 如何恢复文档
  15. 数理统计 - 圆环上随机取3个点组成一个锐角三角形的概率
  16. “数字孪生”语境下的城市:拼图模式与航向之争
  17. docker更改映射端口(实践篇)
  18. 微信小程序10-微搭模板
  19. 弘辽科技:淘宝电商创业的生存法则,你知道吗?
  20. 田野调查手记·浮山摩崖石刻(九)

热门文章

  1. struts中的redirect=true与redirect=false
  2. 用自己拍的一张照片做海报
  3. CMakeLists.txt加载第三方库
  4. 合并字符串(c++)
  5. Anaconda点开一直处于loading application状态
  6. 记一次-更新win10版本到2004
  7. solaris系统关闭服务器,Solaris下如何关闭SUN服务器
  8. 计算机考研就业率,21考研同学需谨慎,三个专业就业率持续走低,包括热门计算机专业...
  9. 云管边端架构图_新通信行业:阿里云构建云管边端物联网布局
  10. FFmpeg的HEVC解码器源代码简单分析:解码器主干部分