自定义View之Paint - 基础

本文详细介绍了自定义View中Paint类的重要API,包括构造函数、常用方法如设置抗锯齿、抖动处理等,以及Flag、Cap、Join、Style和Align等属性的用法。通过对这些特性的理解,开发者可以更好地掌握自定义View的绘图控制。

自定义View有着极大的灵活性,只要敢想总能画出来。既然是画,总是需要工具,那就是所熟悉的的画笔 - Paint。俗话说,工欲善其事必先利其器。接下来,将从Paint的一些列API来认识它。

构造函数

在官方API中,为我们提供了3个构造函数:

  1. Paint()
  2. Paint(int flags)
  3. Paint(Paint paint)

    val paintRed = Paint()
    paintRed.apply {
        color = resources.getColor(android.R.color.holo_red_A<sub>dst</sub>rk)
        // 绘制时可以实现抗锯齿
        flags = Paint.ANTI_ALIAS_FLAG
        // 设置笔触:以路径结束,并不会超过它
        strokeCap = Paint.Cap.BUTT
        // 画笔的样式:只绘画轮廓
        style = Paint.Style.STROKE
        // 设置画笔宽度
        strokeWidth = 36F
    }
    
    val paintBlue = Paint(Paint.ANTI_ALIAS_FLAG)
    paintBlue.apply {
        color = resources.getColor(android.R.color.holo_blue_A<sub>dst</sub>rk)
        strokeCap = Paint.Cap.BUTT
        strokeWidth = 36F
    }
    
    val paintRed_ = Paint(paintRed)
    

在上述示例代码中:

  1. paintRed由默认构造方法创建
  2. paintBlue在创建时传递了Paint.ANTI_ALIAS_FLAG标志位。如果有需要可以同时传递多个标志位

    val paintBlue = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DEV_KERN_TEXT_FLAG)

  3. paintRed_是一个新的Paint,但是在创建时,使用了Paint的属性进行初始化。

常用API

  • reset():重置画笔为默认设置
  • setAntiAlias(boolean aa):设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢
  • setDither(boolean dither):设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
  • setFilterBitmap(boolean filter):如果该项设置为true加快显示速度,本设置项依赖于dither和xfermode的设置
  • setLinearText(boolean linearText):使文本平滑线性缩放
  • setElegantTextHeight(boolean elegant):在Android TextView What does elegantTextHeight do? (API 21)中这么解释:这是一种关闭某些语言的“字体压缩”优化的方法。 如果你不知道我在说什么,那可能是因为你的语言没有“字体压缩”优化,这意味着你不需要关心它。
  • setHinting (int mode):设置Paint的提示模式, HINTING_OFF 或 HINTING_ON

Flag

在Paint中定义了一系列的标志位,以便Paint可以显示某些特性,或者对Paint的效果。比如,我们常设置的抗锯齿特性,就可以使用ANTI_ALIAS_FLAG来设置。下面列出了常用的Flag.

  • ANTI_ALIAS_FLAG:绘制时可以实现抗锯齿
  • DITHER_FLAG:使位图进行有利的抖动
  • EMBEDDED_BITMAP_TEXT_FLAG:可以在绘制文本时使用位图字体
  • FAKE_BOLD_TEXT_FLAG:绘制文本应用合成加粗效果
  • FILTER_BITMAP_FLAG:可在缩放位图上实现双线性采样
  • LINEAR_TEXT_FLAG:使文本能够平滑线性缩放
  • STRIKE_THRU_TEXT_FLAG:使用透油装饰绘制文本
  • SUBPIXEL_TEXT_FLAG:使文本的子像素定位
  • UNDERLINE_TEXT_FLAG:绘制文本下划线

如果要FLAG,可以通过调用构造函数 - Paint(int flags),在创建Paint实例时就设置标志位。比如:

val paint = Paint(Paint.ANTI_ALIAS_FLAG)

在创建paint时,就给定了标志位 - ANTI_ALIAS_FLAG,那么在绘制时,可以实现抗锯齿。

也可以调用setFlags(int flags)方法设置标志位:

paint.setFlags(Paint.ANTI_ALIAS_FLAG)

Paint.Cap

Paint.Cap是一个枚举,其指定了针对线条和路径的开始和结束的处理方式。官方的解释有点难懂,容易理解的就是画笔笔触的样式,所谓笔触就是笔与画布接触的部分。比如,平时使用的铅笔,写字时习惯削成圆角,画出来线的两端是圆形;为了方便涂选择的答题卡,又将笔尖削成扁平的长方形,那画出来的线条的两端就是矩形,正好填充答案部分。其默认值为BUTT。

  • BUTT:以指定返回坐标的路径开始和结束,不会超出给定的坐标范围
  • ROUND:笔触是半圆形的,其中心为路径的结束位置。轨迹会超过给定的坐标范围
  • SQUARE:笔触为方形,其中心为路径的结束位置。轨迹会超过给定的坐标范围

这里写图片描述

仔细看效果图,笔触不管是半圆形的还是方形的,其超出的坐标范围的大小与画笔的宽度有关系,都是画笔的宽度的一半。

Paint.Join

Join指定线条和曲线在描边路径的处理方式。默认值为MITER。

  • BEVEL:连接的外缘以直线相交
  • MITER:连接的外缘以锐角相交
  • ROUND:连接的外缘以圆弧相交

这里写图片描述

Paint.Style

Style指定画笔绘制图形时的样式:只绘制图形轮廓(描边),只绘制图形内容 或者既绘制轮廓也绘制内容

  • STROKE:只绘制图形轮廓(描边)
  • FILL:只绘制图形内容,不绘制轮廓
  • FILL_AND_STROKE:既绘制轮廓也绘制内容

这里写图片描述

当绘制轮廓时,笔触的中心当前绘制的位置,其中SROKE和FILL效果图有鲜明的对比。

Paint. Align

见文本之setTextAlign

这里写图片描述

Color

画笔的默认颜色是黑色,这并不是我们想要的颜色。在自定义View时,View的颜色各异。就像前面的例子那样,总是不断指定不同的画笔的颜色。如果想指定颜色可以调用这些方法:

  • setARGB(int a, int r, int g, int b):设置绘制的颜色,a代表透明度,r,g,b代表颜色值。
  • setColor(int color):设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色
  • setAlpha(int a):设置绘制图形的透明度

例如:

    val paintDefault = Paint()

    // Color
    val paintRed = Paint(Paint.ANTI_ALIAS_FLAG)
    paintRed.color = resources.getColor(android.R.color.holo_red_A<sub>dst</sub>rk)

    // Alpha
    val paintAlpha = Paint(paintRed)
    paintAlpha.alpha = 80

    // ARGB
    val paintArgb = Paint(Paint.ANTI_ALIAS_FLAG)
    paintArgb.setARGB(255, 128, 0, 128)

在示例中:

  1. paintDefault的颜色默认的,即黑色
  2. paintRed的颜色通过setColor设置为红色,但未设置透明度
  3. paintAlpha是基于paintRed创建的,不同的是,其将透明度设置为80
  4. paintArgb通过ARGB设置颜色

这里写图片描述

如果对于透明度换算不熟悉的,可参考Android 颜色透明度换算




若想了解更多Paint相关的内容,请跳入: 自定义View系列文章目录




如果觉得我的文章对您有用,请随意点赞、评论。您的支持将鼓励我继续创作!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值