Paint

API—Paint | Android 开发者

Paint即画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等,
大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。

嵌套类

  1. Paint.Align ,设置字符位置,字符以坐标(x,y)为源点。
  2. Paint.Cap,线段断点形状(默认Paint.Cap.BUTT):
  3. Paint.FontMetrics,字体属性及测量。
    如需详细了解,请参考:
    Paint—FontMetrics - qq_20198405的博客 - 博客频道 - CSDN.NET
  4. Paint.FontMetricsInt
  5. Paint.Join,设置结合处的样子。
  6. Paint.Style,设置空心(默认Paint.Style.FILL);

常量

标记 说明
ANTI_ALIAS_FLAG 抗锯齿的标志
DEV_KERN_TEXT_FLAG
DITHER_FLAG 使位图进行有利的抖动的位掩码标志
FAKE_BOLD_TEXT_FLAG 文本仿粗体的标志
FILTER_BITMAP_FLAG 使位图过滤的位掩码标志
HINTING_OFF
HINTING_ON
LINEAR_TEXT_FLAG
STRIKE_THRU_TEXT_FLAG 文本删除线的标志
SUBPIXEL_TEXT_FLAG
UNDERLINE_TEXT_FLAG 文字的下划线的标志

构造方法

Paint的构造方法有两种:

Paint()Paint(int flags)Paint(Paint paint)

setXXX()方法族:

  • set(Paint src):
    为当前画笔设置一个画笔,说白了就是把另一个画笔的属性设置Copy给我们的画笔。
  • setARGB(int a, int r, int g, int b):
    设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
  • setAlpha(int a):
    设置绘制图形的透明度,设置范围是[0..255]。
  • setAntiAlias(boolean aa):
    消除锯齿(默认不消除锯齿)。
    不消除锯齿:
    Paint_第1张图片
    消除锯齿:
    Paint_第2张图片
  • setColor(int color):
    设置画笔颜色。
  • setColorFilter(ColorFilter filter):
    设置颜色过滤,这个方法需要我们传入一个ColorFilter参数同样也会返回一个ColorFilter实例。 如需详细了解,请参考:
    Paint—ColorFilter - qq_20198405的博客 - 博客频道 - CSDN.NET

  • setDither(boolean dither):
    设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
    这玩意用来设置我们在绘制图像时的抗抖动,也称为递色,那什么叫抗抖动呢?在Android中我确实不好拿出一个明显的例子,我就在PS里模拟说明一下:
    Paint_第3张图片
    大家看到的这张七彩渐变图是一张RGB565模式下图片,即便图片不是很大我们依然可以很清晰地看到在两种颜色交接的地方有一些色块之类的东西感觉很不柔和,因为在RGB模式下只能显示2^16=65535种色彩,因此很多丰富的色彩变化无法呈现,而Android呢为我们提供了抗抖动这么一个方法,它会将相邻像素之间颜色值进行一种“中和”以呈现一个更细腻的过渡色:
    Paint_第4张图片
    放大来看,其在很多相邻像素之间插入了一个“中间值”:
    Paint_第5张图片
    抗抖动不是Android的专利,是图形图像领域的一种解决位图精度的技术。

  • setFakeBoldText(boolean fakeBoldText):
    设置文本仿粗体。注意设置在小字体上效果会非常差。
  • setFilterBitmap(boolean filter):
    如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示速度,本设置项依赖于dither和xfermode的设置。
  • setFlags(int flags):
    设置标志,还是对paint进行样式的设置。比如
 // 实例化画笔并打开抗锯齿
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  • setHinting(int mode):
    设置画笔的隐藏模式。可以是 HINTING_OFF or HINTING_ON之一。
  • setLinearText(boolean linearText):
    设置是否打开线性文本标识,这玩意对大多数人来说都很奇怪不知道这玩意什么意思。想要明白这东西你要先知道文本在Android中是如何进行存储和计算的。在Android中文本的绘制需要使用一个bitmap作为单个字符的缓存,既然是缓存必定要使用一定的空间,我们可以通过setLinearText (true)告诉Android我们不需要这样的文本缓存。
  • setMaskFilter(MaskFilter maskfilter):
    这个方法可以用来对图像进行一定的处理,实现滤镜的效果,如滤化,立体等。 如需详细了解,请参考:
    Paint—MaskFilter(面具) - qq_20198405的博客 - 博客频道 - CSDN.NET

  • setPathEffect(PathEffect effect):设置绘制路径时的路径效果(ComposePathEffect, CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect),如点画线等 。 如需详细了解,请参考:
    Paint—PathEffect(路径效果) - qq_20198405的博客 - 博客频道 - CSDN.NET

  • setRasterizer(Rasterizer rasterizer):
    设置光栅,光栅这东西涉及太多太多物理知识。该方法同样不支持HW在API 21中被遗弃了,所以不推荐使用。
  • setShader(Shader shader):
    设置画笔的填充效果(BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient),使用Shader可以绘制出各种渐变效果。如需详细了解,请参考:
    Paint—Shader - qq_20198405的博客 - 博客频道 - CSDN.NET
  • setShadowLayer(float radius, float dx, float dy, int color):
    radius表示阴影的扩散半径;dx和dy表示阴影平面上的偏移值;shadowColor就不说了阴影颜色。
    注意: 这个方法不支持硬件加速,所以我们要测试时必须先关闭硬件加速。
  • setStrikeThruText(boolean strikeThruText):
    设置文本删除线。
  • setStrokeCap(Paint.Cap cap):
    设置线段断点形状(默认Paint.Cap.BUTT)
    Paint.Cap.BUTT : 不多不少

    Paint.Cap.ROUND : 多了一个圆头
    这里写图片描述
    Paint.Cap.SQUARE:多了一个方头
    这里写图片描述
  • setStrokeJoin(Paint.Join join):
    设置画笔转弯处的连接风格(BEVEL-直线、MITER -锐角、ROUND-圆弧 )。
  • setStrokeMiter(float miter):
    设置画笔倾斜度。
  • setStrokeWidth(float width):
    当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度。
  • setStyle(Paint.Style style):
    设置空心(默认Paint.Style.FILL)
    Paint.Style.FILL :填充内部
    Paint_第6张图片
    Paint.Style.STROKE :仅描边
    Paint_第7张图片
    Paint.Style.FILL_AND_STROKE :填充内部和描边

    再来一张更详细的图:
    Paint_第8张图片
  • setSubpixelText(boolean subpixelText):
    设置自像素。如果该项为true,将有助于文本在LCD屏幕上的显示效果。
  • setTextAlign(Paint.Align align):
    设置字符位置,字符以坐标(x,y)为源点。

center表示字符在水平方向上以x中心向左右两边延伸,在垂直方向以y为起点向下延伸;
left表示字符在水平方向上以x为起点向右延伸,在垂直方向上以y为起点向下延伸;
right表示字符在水平方向上以x为起点向左延伸,在垂直方向上以y为起点向下延伸。

  • setTextLocale(Locale locale):
    设置地理位置,这里如果你要使用,直接传入Locale.getDefault()即可。它用来设置文本的区域比如中文、日文等。
  • setTextScaleX(float scaleX):
    设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果。
  • setTextSize(float textSize):
    设置绘制文字的字号大小。
  • setTextSkewX(float skewX):
    设置斜体文字,skewX为倾斜弧度。这个倾斜值没有具体的范围,但是官方推崇的值为-0.25可以得到比较好的倾斜文本效果,值为负右倾值为正左倾,默认值为0。
  • setTypeface(Typeface typeface):
    设置字体类型和样式,上面我们也使用过,Android中字体有四种样式:BOLD(加粗),BOLD_ITALIC(加粗并倾斜),ITALIC(倾斜),NORMAL(正常);而其为我们提供的字体有五种:DEFAULT,DEFAULT_BOLD,MONOSPACE,SANS_SERIFSERIF,这些什么类型啊、字体啊之类的都很简单大家自己去试试就知道就不多说了。 如需详细了解,请参考:
    Paint—Typeface - qq_20198405的博客 - 博客频道 - CSDN.NET
  • setUnderlineText(boolean underlineText):
    设置文字的下划线。
  • setXfermode(Xfermode xfermode):
    设置图像的混合模式,详细使用方式请参考:
    Paint—PorterDuffXfermode - qq_20198405的博客 - 博客频道 - CSDN.NET
    Paint—Xfermode、 PixelXorXfermode - qq_20198405的博客 - 博客频道 - CSDN.NET

getXXX()方法族:

  • getAlpha()
  • getColor()
  • getColorFilter()
  • getFillPath(Path src, Path dst)
  • getFlags()
  • getFontMetrics(Paint.FontMetrics metrics):
    这个和我们之前用到的getFontMetrics()相比多了个参数,getFontMetrics()返回的是FontMetrics对象,而getFontMetrics(Paint.FontMetrics metrics)返回的是文本的行间距,如果metrics的值不为空则返回FontMetrics对象的值。
  • getFontMetrics():得到一个FontMetrics对象,返回对象中的参数都是float。
  • getFontMetricsInt():返回对象中的参数都是int。
  • getFontMetricsInt(Paint.FontMetricsInt fmi)
  • getFontSpacing():返回字符行间距。
  • getHinting()
  • getMaskFilter()
  • getPathEffect()
  • getRasterizer()
  • getShader()
  • getStrokeCap()
  • getStrokeJoin()
  • getStrokeMiter()
  • getStrokeWidth()
  • getStyle()
  • getTextAlign()
  • getTextBounds(char[] text, int index, int count, Rect bounds)
  • getTextBounds(String text, int start, int end, Rect bounds)
  • getTextLocale()
  • 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)
  • getTextScaleX()
  • getTextSize()
  • getTextSkewX()
  • getTextWidths(String text, float[] widths)
  • getTextWidths(CharSequence text, int start, int end, float[] widths)
  • getTextWidths(String text, int start, int end, float[] widths)
  • getTextWidths(char[] text, int index, int count, float[] widths)
  • getTypeface()
  • getXfermode()

isXXX()方法族:

  • isAntiAlias()
  • isDither()
  • isFakeBoldText()
  • isFilterBitmap()
  • isLinearText()
  • isStrikeThruText()
  • isSubpixelText()
  • isUnderlineText()

其他方法:

  • ascent():返回上坡度的值。
  • descent():返回下坡度的值。
  • clearShadowLayer()

  • breakText(CharSequence text, int start, int end, boolean
    measureForwards, float maxWidth, float[] measuredWidth)

  • breakText(String text, boolean measureForwards, float maxWidth,
    float[] measuredWidth)
  • breakText(char[] text, int index, int count, float maxWidth, float[]
    measuredWidth)

    • 这三个方法让我们设置一个最大宽度,在不超过这个宽度的范围内返回实际测量值否则停止测量。
text 表示我们的字符串;
start 表示从第几个字符串开始测量;
end 表示从测量到第几个字符串为止;
measureForwards 表示向前还是向后测量;
maxWidth 表示一个给定的最大宽度在这个宽度内能测量出几个字符;
measuredWidth 为一个可选项,可以为空,不为空时返回真实的测量值

这些方法在一些结合文本处理的应用里比较常用,比如文本阅读器的翻页效果,我们需要在翻页的时候动态折断或生成一行字符串,这就派上用场了~

  • measureText(String text)
  • measureText(CharSequence text, int start, int end)
  • measureText(String text, int start, int end)
  • measureText(char[] text, int index, int count)
    • 测量文本宽度,上面我们已经使用过了,这四个方法都是一样的只是参数稍有不同罢了。
  • reset()::恢复画笔到默认配置。

源码下载
ApiDemo下载
博客中用到的网格插件

引用:
自定义控件其实很简单1/4 - AigeStudio - 博客频道 - CSDN.NET
android paint cap join 理解 图示 - Android移动开发技术文章_手机开发 - 红黑联盟
android Graphics(一):概述及基本几何图形绘制 - harvic - 博客频道 - CSDN.NET
Android笔记二十八.Android绘图深度解析-android-爱编程
用TextPaint来绘制文字 - developer_Kale - 博客园

其他:
详解Paint的各种set方法 - 推酷

你可能感兴趣的:(android,绘图,paint)