Android自定义View-绘图

285 阅读3分钟

硬件加速

Android在API14过后默认开启硬件加速,在GPU加速的时候,实际上使用了OpenGL的相关函数来完成绘制。

优点是提高Android系统显示和刷新的速度。

缺点:

  • 兼容性问题
  • 内存消耗变大,加载OpenGL会增大内存使用
  • 电量消耗大,因为多了一个硬件工作

下面有一个支持函数的表格,叉表示一直不支持。

IMG_20220503_141332.jpg

IMG_20220503_141401.jpg

在API14以上,如果不用硬件加速,可以关闭。

1.在AndroidManifeest中关闭硬件加速,可以为整个应用开启/关闭硬件加速

<application android:hardwareAccelerated="true"/>

2.在Activity标签下开启或关闭硬件加速

<activity android:hardwareAccelearted="true"/>

3.在Window层级上开启硬件加速,在Window层级上只能开启,不能关闭。

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWEAR_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWEAR_ACCELERATED);

4.在View层级关闭硬件加速,View层级不支持开启硬件加速

setLayerType(View.LAYER_TYPE_SOFTWARE,null)
<LinearLayout
    android:layerType="sofrware">

文字

文字绘制的时候一般会调用drawtext函数

public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint)

这里的y是文字基线的y值,这里的x并不是基线开始的x值,x文字所占用的矩形的左边的x值。

还有一个函数,paint的setTextAlign()

public void setTextAlign(Align align)

这里可以传入三个值

public enum Align {
    /**
     * The text is drawn to the right of the x,y origin
     */
    LEFT    (0),
    /**
     * The text is drawn centered horizontally on the x,y origin
     */
    CENTER  (1),
    /**
     * The text is drawn to the left of the x,y origin
     */
    RIGHT   (2);
}

当我们传入LEFT的时候,绘制出来的文字左下角就是x的坐标。当我们传入CENTER的时候,文字的正中间才是x的坐标。

文字在绘制的时候,除了基线,还有4个线

  • ascent:系统推荐的,在绘制单个字符的时候,字符应该使用的最高高度所在的线
  • descent:系统推荐的,在绘制单个字符的时候,字符应该使用的最低高度所在的线
  • top:系统推荐的,在绘制单个字符的时候,字符应该使用的最高高度所在的线
  • bottom:系统推荐的,在绘制单个字符的时候,字符应该使用的最高高度所在的线

93130482BE6921D0C51C1DEB5974FD51.jpg

FontMetrics

FontMetrics为我们提供了其他四条线相对于基线的位置

  • ascent = ascent线的y坐标 - 基线的y坐标
  • descent = descent线的y坐标 - 基线的y坐标
  • top = top线的y坐标 - 基线的y坐标
  • bottom = bottom线的y坐标 - 基线的y坐标

获取文字最小矩形

文字在绘制的时候上下左右都会有一点边框,如果我们想获取文字的最小矩形,我们可以用getTextBounds方法来获取。

public void getTextBounds(String text, int start, int end, Rect bounds)

如果不设置paint的align,那么(0,0)默认是基线,获取出来的矩形可能y是负数。

paint

public PathEffect setPathEffect(PathEffect effect)

设置画笔路径样式 1651631400468.jpg

public void setStrokeCap(Cap cap)

设置画笔线帽样式。

  • Cap.ROUND:圆形线帽
  • Cap.SQUARE:方形线帽
  • Cap.BUTT:无线帽

下面分别是无线帽,方形线帽和圆形线帽 IMG_20220504_103554.jpg

public void setStrokeJoin(Join join)

设置路径转角样式

  • Join.MITER锐角
  • Join.ROUND圆弧
  • Join.BEVEL直线

IMG_20220504_103620.jpg

public void setDither(boolean dither)

设置抗抖动,在多个颜色渐变过渡的时候,因为RGB模式下只能显示65535种颜色,在颜色丰富的情况下无法呈现,就会有很多马赛克的情况,这个时候设置抗抖动,过渡效果就会更好。

public void setFakeBoldText(boolean fakeBoldText)

设置是否为粗体

public void setStrikeThruText(boolean strikeThruText)

设置删除线效果

public void setUnderlineText(boolean underlineText)

设置下划线

public void setTextAlign(Align align)

设置写字的模式

public void setTextScaleX(float scaleX)

设置水平拉伸

public void setTextSkewX(float skewX)

设置水平倾斜,默认为-0.25,往右倾斜。

public void setSubpixelText(boolean subpixelText) 

设置亚像素绘制文本,增加文本清晰度,可能会出现不适配的情况