一、前言

  我们用set方法来设置画笔的样式,类似于我们挑选画笔画画的过程。由于上面有些方法不支持硬件加速,所以在高版本系统中可能会没有效果。因此,我们首先来看看官方废弃的方法。

下图来自:https://developer.android.com/guide/topics/graphics/hardware-accel.html#unsupported

当你要使用打叉的方法时,请关闭硬件加速。关闭的方法有两种:

(1)在application配置文件中关闭硬件加速:

 <application
android:allowBackup="true"
android:hardwareAccelerated="false"

android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" > ……

(2)在自定义view中调用方法来关闭:

setLayerType(LAYER_TYPE_SOFTWARE, null); 

注意:因为在配置文件中关闭会让整个应用程序无法使用硬件加速的特性,所以强烈建议用第二种方式进行关闭。

二、详细解读各种set方法

set(Paint src)

顾名思义为当前画笔设置一个画笔,说白了就是把另一个画笔的属性设置Copy给我们的画笔,不累赘了

setAlpha(int a);

设置绘制图形的透明度,设置范围是[0..255]

setAntiAlias(boolean aa)

打开抗锯齿。抗锯齿是依赖于算法的,算法决定抗锯齿的效率,在我们绘制棱角分明的图像时,比如一个矩形、一张位图,我们不需要打开抗锯齿。

setARGB(int a, int r, int g, int b)

设置绘制的颜色,a代表透明度,r,g,b代表颜色值。

setColor(int color)

设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。

setColorFilter(ColorFilter filter)

设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例。如需详细了解,请参考:

详解Paint的setColorFilter(ColorFilter filter)

setDither(boolean dither)

设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰。这玩意用来设置我们在绘制图像时的抗抖动,也称为递色,那什么叫抗抖动呢?在Android中我确实不好拿出一个明显的例子,我就在PS里模拟说明一下:

大家看到的这张七彩渐变图是一张RGB565模式下图片,即便图片不是很大我们依然可以很清晰地看到在两种颜色交接的地方有一些色块之类的东西感觉很不柔和,因为在RGB模式下只能显示2^16=65535种色彩,因此很多丰富的色彩变化无法呈现,而Android呢为我们提供了抗抖动这么一个方法,它会将相邻像素之间颜色值进行一种“中和”以呈现一个更细腻的过渡色:

setElegantTextHeight(boolean elegant)
 
具体效果未知,个人测试后出现了没有此方法的异常,百度无果。故,暂时不推荐使用。
 
 

setFakeBoldText (boolean fakeBoldText)

设置文本仿粗体。注意设置在小字体上效果会非常差。

setFilterBitmap(boolean filter)

如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置。

setFlags (int flags)

设置标志,还是对paint进行样式的设置。而且,这里设置的flag可以放在paint的初始化中,比如:

// 实例化画笔并打开抗锯齿
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);  
setFontFeatureSettings(String settings)
设置字体的样式,这个样式和CSS样式很类似。样式可以为null,可以参考:http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings
 
setHinting(int mode)
 
设置画笔的隐藏模式。可以是HINTING_OFF or HINTING_ON之一。

setLetterSpacing(float letterSpacing)

设置行间距,默认是0.

setLinearText (boolean linearText)

设置是否打开线性文本标识,这玩意对大多数人来说都很奇怪不知道这玩意什么意思。想要明白这东西你要先知道文本在Android中是如何进行存储和计算的。在Android中文本的绘制需要使用一个bitmap作为单个字符的缓存,既然是缓存必定要使用一定的空间,我们可以通过setLinearText (true)告诉Android我们不需要这样的文本缓存。

setMaskFilter(MaskFilter maskfilter)

setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用来对图像进行一定的处理。如需详细了解,请参考:

详解Paint的setMaskFilter(MaskFilter maskfilter)

setPathEffect(PathEffect effect)

设置绘制路径的效果,如点画线等 。如需详细了解,请参考:

详解Paint的setPathEffect(PathEffect effect)

setRasterizer (Rasterizer rasterizer)

设置光栅,光栅这东西涉及太多太多物理知识。该方法同样不支持HW在API 21中被遗弃了,所以不推荐使用。

setShader(Shader shader)

的设置着色方案,Shader在三维软件中我们称之为着色器,其作用是来给图像着色。详细使用方式,请参考:

详解Paint的setShader(Shader shader)

setShadowLayer(float radius, float dx, float dy, int shadowColor)

radius表示阴影的扩散半径;dx和dy表示阴影平面上的偏移值;shadowColor就不说了阴影颜色。

注意:这个方法不支持硬件加速,所以我们要测试时必须先关闭硬件加速。

该方法为我们绘制的图形添加一个阴影层效果:

    @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 关闭单个view的硬件加速
setLayerType(LAYER_TYPE_SOFTWARE, null);
// 先绘制位图
mPaint.setColor(Color.RED);
// 设置阴影效果
mPaint.setShadowLayer(10, 3, 3, Color.DKGRAY);
// 画一个矩形
canvas.drawRect(200, 200, 600, 600, mPaint);
}

BlurMaskFilter可以模拟类似效果,跟BlurMaskFilter比起来setShadowLayer()方法是不是更简捷呢?但是BlurMaskFilter能做的setShadowLayer却不一定能做到哦!

setStrokeCap(Paint.Cap cap)

该方法用来设置我们画笔的笔触风格,比如:ROUND,表示是圆角的笔触。那么什么叫笔触呢,其实很简单,就像我们现实世界中的笔,如果你用圆珠笔在纸上戳一点,那么这个点一定是个圆,即便很小,它代表了笔的笔触形状,如果我们把一支铅笔笔尖削成方形的,那么画出来的线条会是一条弯曲的“矩形”,这就是笔触的意思。除了ROUND,Paint.Cap还提供了另外两种类型:SQUARE和BUTT

setStrokeJoin(Paint.Join join)

这个方法用于设置接合处的形态,就像你用代码画了一条线,但是这条线其实是由无数条小线拼接成的,拼接处的形状就由该方法指定。可选参数是:BEVEL,MITER,ROUND。

mPaint.setStrokeJoin(Paint.Join.ROUND);

setStrokeWidth(float width);

当画笔样式(style)为STROKE或FILL_OR_STROKE时(空心样式时),设置笔刷的粗细度。

setStrokeMiter(float miter )

设置笔画的倾斜度,取值:>=0。如:小时候用的铅笔,削的时候斜与垂直削出来的笔尖效果是不一样的。主要是用来设置笔触的连接处的样式。可以和setStrokeJoin()来比较比较。

 
setStyle(Style style)
置画笔样式,如果不设置,默认是全部填充(FILL)。可选项为:FILL,FILL_OR_STROKE,或STROKE 

画笔样式分三种:
 1.Paint.Style.STROKE:描边
 2.Paint.Style.FILL_AND_STROKE:描边并填充
 3.Paint.Style.FILL:填充

 
setSubpixelText(boolean subpixelText)
 
设置自像素。如果该项为true,将有助于文本在LCD屏幕上的显示效果。
 
 
setXfermode(Xfermode xfermode)
设置图像的混合模式,详细使用方式请参考:
 

——————————————————————————————————————

注意:下方的方法仅仅是简要的介绍,如果想要详细了解,请移步:

用TextPaint来绘制文字

setStrikeThruText (boolean strikeThruText)

设置文本删除线。

setTextAlign (Paint.Align align)

设置文本的对齐方式,可供选的方式有三种:CENTER,LEFT和RIGHT。

setTextLocale (Locale locale)

设置地理位置,这里如果你要使用,直接传入Locale.getDefault()即可。它用来设置文本的区域比如中文、日文等。

setTextScaleX (float scaleX)

将文本沿X轴水平缩放,默认值为1,当值大于1会沿X轴水平放大文本,当值小于1会沿X轴水平缩放文本

setTextSize (float textSize)

设置文字的大小,但是要注意该值必需大于零。

setTextSkewX(float skewX)

设置文本在水平方向上的倾斜。这个倾斜值没有具体的范围,但是官方推崇的值为-0.25可以得到比较好的倾斜文本效果,值为负右倾值为正左倾,默认值为0。

setTypeface (Typeface typeface)

设置文本字体样式。

setUnderlineText(boolean underlineText)

设置文字的下划线。

参考自:

http://www.cnblogs.com/tianzhijiexian/p/4297664.html

http://blog.csdn.net/aigestudio/article/details/41447349

https://code.csdn.net/snippets/505646/

http://bbs.51cto.com/thread-835441-1.html

http://blog.csdn.net/xanxus46/article/details/7883554

详解Paint的各种set方法的更多相关文章

  1. ubuntu apache2配置详解(含虚拟主机配置方法)

    ubuntu apache2配置详解(含虚拟主机配置方法) 在Windows下,Apache的配置文件通常只有一个,就是httpd.conf.但我在Ubuntu Linux上用apt-get inst ...

  2. 详解Java中的clone方法

    详解Java中的clone方法 参考:http://blog.csdn.net/zhangjg_blog/article/details/18369201/ 所谓的复制对象,首先要分配一个和源对象同样 ...

  3. 分区工具parted的详解及常用分区使用方法【转】

    来源:http://blog.51cto.com/zhangmingqian/1068779 分区工具parted的详解及常用分区使用方法 一.         parted的用途及说明 概括使用说明 ...

  4. Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法

    Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法: https://blog.csdn.net/mingjie1212/article/details/485250 ...

  5. (转)linux命令详解之useradd命令使用方法

    linux命令详解之useradd命令使用方法 原文:http://blog.csdn.net/u011537073/article/details/51987121 Linux 系统是一个多用户多任 ...

  6. 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂安装过程详解及安装失败解决方法

    因Excel催化剂用了VSTO的开发技术,并且为了最好的用户体验,用了Clickonce的布署方式(无需人工干预自动更新,让用户使用如浏览器访问网站一般,永远是最新的内容和功能).对安装过程有一定的难 ...

  7. 详解Paint的setXfermode(Xfermode xfermode)

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是 ...

  8. 【转】详解JavaScript中的异常处理方法

    有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个 ...

  9. JpGraph使用详解之中文乱码解决方法

    在前面的JpGraph使用详解这篇文章,已经对JpGraph的使用方法作了详细的交代,前面说好的,接下来解决中文乱码. JpGraph为什么会出现中文乱码 在JpGraph中默认是要把字符串转成utf ...

随机推荐

  1. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  2. [CS231n-CNN] Backpropagation(反向传播算法)

    课程主页:http://cs231n.stanford.edu/ 上节讲到loss function: 引出了求导数使得loss function减小. -Back Propagation :梯度下降 ...

  3. C# 退出程序方法

    1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit();  强制所有消息中 ...

  4. 轻量级IOC框架:Ninject (下)

    一,创建依赖链(Chains of Dependency) 当我们向Ninject请求创建一个类型时,Ninject会去检查该类型和其他类型之间的耦合关系.如果有额外的依赖,Ninject也会解析它们 ...

  5. Cannot find SS.INI file for user *** 解决方法

    昨天还用的好好的VSS今天早上一来就提示: Cannot find SS.INI file for user *** 度娘了一下,好像都是说的: 1,vss\users\***\  下无文件SS.IN ...

  6. [Shell] 读取脚本路径

    以下是几种在 Shell 中读取路径的方法. 返回当前工作目录绝对路径 echo $(pwd) 返回 shell 第一个参数.如果被执行对象位于 PATH 路径中,则返回该对象绝对路径:否则返回被执行 ...

  7. VC2013的一个bug

    前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其它的非C++元素.这是一个比较新的 ...

  8. bootstrap插件学习-bootstrap.collapse.js

    先看bootstrap.collapse.js的结构 var Collapse = function ( element, options ){} // 构造器 Collapse.prototype ...

  9. PHP去除BOM头的方法

    BOM头是UTF-8来告诉编辑器:我是UTF8编码.它的编码是\xEF\xBB\xBF 但是PHP在设计之初并没有考虑到BOM头的问题,所以在编解码的时候很容易出现问题   比如今天遇到的问题,jso ...

  10. CSS3属性transform详解

    在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾斜.移动这四种类型的变形处理,本文将对此做详细介绍. 一.旋转 rotate 用法:transform: rotate(45 ...