• Android自定义View--Paint


    这一节主要复习Android里的Paint使用,先了解一些绘制相关的背景知识。

    硬件加速

             GPU 的英文全称为 Graphic Processing Unit,中文翻译为“图形处理器”。 与 CPU 不同 ,GPU 是专门为处理图形任务而产生的芯片 。在 GPU 出现之前, CPU 一直负责所有的运算工作。 CPU 的架构是有利于 X86 指令集的串行架构, CPU 从设计思路上适合尽可能快地完成一项任务,但当面对类似多媒体、图形图像处理类型的任务时,就会显得力不从心 。 因为在多媒体计算中通常要求更高的运算密度、多并发线程和频繁的存储器访问 。 显然,当你打游戏时,屏幕上的动画是需要实时刷新的,这些都需要频繁的计算、存取动作 。 如果CPU不能及时响应,屏幕就会显得很卡。为了专 门处理多媒体的计算,存储任务, GPU 应运而生。 GPU 中自带处理器和存储器,专 门用来计算和存储多媒体任务 。

    软件绘制与硬件加速的区别:

            在 CPU 绘制和 GPU 绘制时,在流程上是有区别的 。在基于软件的绘制模型下, CPU 主导绘图,视图按照两个步骤绘制 :1 让 View 层次结构失效 。2 绘制 View 层次结构。在基于硬件加速的绘制模式下, GPU 主导绘图,视图按照三个步骤绘制:1让 View 层次结构失效。2 记录、更新显示列表。3 绘制显示列表 。可以发现 ,在 GPU 加速时,流程中 多了一项“记录 、 更新显示列表”, 表示在第一步 View层次结构失效后 ,并不是直接开始逐层绘制 的,而是首先把这些 View的绘制函数作为绘制指令记录在一个显示列表中,然后再读取显示列表中的绘制指令,调用OpenGL 的相关函数完成实际绘制。也就是说, 在 GPU 加速时, 实际上是使用 OpenGL 的相关函数来完成绘制的 。所以,使用 GPU 加速的优点显而易见:硬件加速提高了 Android 系统显示和刷新的速度。它的缺点也显而易见 :1) 兼容性问题 。由于是将绘制函数转换成 OpenGL 指令来绘制的,所以必然会存在OpenGL 并不能完全支持原始绘制函数的问题,从而造成在打开 GPU 加速时效果会失效的问题 。2)电量消耗问题 。多使用了一个部件,当然会更耗电。

    Paint

        这是Android系统提供的API,该类保存了绘制几何图形、文本和位图的样式和颜色信息。可以使用Paint保存的样式和颜色,来绘制图形、文本和bitmap.

    API:

    1. reset()
    2. 重置画笔 。
    3. setColor(int color)
    4. 给画笔设置颜色值。
    5. setARGB (int a ,int r ,int g,int b )
    6. 同样是设置颜色,但是利用 A,R,G,B分开设置 。
    7. setAlpha(int a)
    8. 设置画笔透明度 。
    9. setStyle(Paint.Style style)
    10. 设置画笔样式,取值如下。
    11. Paint.Style.FILL:填充内部。
    12. Paint.Style.FILL_AND_STRO阻:填充内部和描边。
    13. Paint.Style.STROKE:仅描边 。
    14. setStrokeWidth(float width)//设置画笔的宽度
    15. setStrokeCap //设置线帽
    1. public enum Cap {
    2. BUTT (0),
    3. ROUND (1),
    4. SQUARE (2);
    5. private Cap(int nativeInt){
    6. this.nativeInt = nativeInt;
    7. }
    8. final int nativeInt;
    9. }
    10. BUTT:没有线帽,默认模式
    11. ROUND:圆形
    12. SQUARE:方形

    基本使用

    1. public class PaintView extends View {
    2. private Paint mPaint;
    3. private String text = "";
    4. public PaintView(Context context) {
    5. this(context,null);
    6. }
    7. public PaintView(Context context, @Nullable AttributeSet attrs) {
    8. this(context,attrs,0);
    9. }
    10. public PaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    11. super(context, attrs, defStyleAttr);
    12. init(context,attrs,defStyleAttr);
    13. }
    14. private void init(Context context,AttributeSet attrs,int defStyleAttr) {
    15. mPaint = new Paint();
    16. mPaint.setTextSize(38);
    17. mPaint.setColor(Color.RED);
    18. }
    19. @Override
    20. protected void onDraw(Canvas canvas) {
    21. super.onDraw(canvas);
    22. int x = getPaddingLeft();
    23. Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
    24. int dy = (fontMetricsInt.bottom - fontMetricsInt.top)/2 - fontMetricsInt.bottom;
    25. int baseLine = getHeight()/2 + dy;
    26. canvas.drawText("HelloWorld...",x,baseLine,mPaint);
    27. }
    28. }
    1. /**
    2. * text : 要绘制的文字
    3. * x : 绘制原点 x 坐标
    4. * y : 绘制原点 y 坐标
    5. * paint : 用来作画的画笔
    6. */
    7. public android drawText (String text, float x, float y, Paint paint )

    FontMetrics

            我们知道,基线的位置是在构造 drawText()函数时由参数 y 来决定的,那 ascent 、 descent 、top 、 bottom 这些线的位置应该怎么计算出来呢?Android 给我们提供了 一个类 : FontMetrics,它里面有 4 个成员变量。

    1. FontMetrics: :ascent;
    2. FontMetrics: :descent;
    3. FontMetrics: :top;
    4. FontMetrics: :bottom;

    这 4 个成员变量的含义与值的计算方法分别如下:

    1. ascent = ascent线的y坐标- baseline线的y坐标。
    2. descent = descent线的y坐标-baseline线的y坐标。
    3. top= top 线的y坐标-baseline线的y坐标。
    4. bottom = bottom线的y坐标-baseline线的y坐标。

    获取 FontMetrics 对象:

    一般根据 Paint 对象来获取 FontMetrics 对象。

    1. Paint paint = new Paint () ;
    2. Paint.FontMetrics fm = paint.getFontMetrics();
    3. Paint.FontMetricsint fmint = paint.getFontMetricsint();

            可以看到,通过 paint.getFontMetrics()函数可以得到对应的 FontMetrics 对象 。这里还有一个与 FontMetrics同样的类,叫作 FontMetricslnt,它的含义与FontMetrics 完全相同,只是得到的值的类型不一样而己 。FontMetricslnt 中 4 个成员变量的值都是 Int 类型的,而FontMetricslnt 中 4 个成员变量的值则都是Float类型的 。

  • 相关阅读:
    【POJ No. 3253】 围栏修复 Fence Repair
    Nginx面试常问题&工作原理揭秘
    避雷器雷击计数器检验
    使用 Amazon Rekognition API 进行文本检测和 OCR
    基于JAVA全国消费水平展示平台计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    Springboot毕设项目公司资产23sh6(java+VUE+Mybatis+Maven+Mysql)
    变年轻特效怎么制作?这三个方法你值得收藏
    Excel——时间戳与标准北京时间的互相转换
    【企业微信扫码登录】html网页中如何实现企业微信扫码登录功能,图文描述简单三步实现
    为什么拼多多总能给市场带来惊喜?
  • 原文地址:https://blog.csdn.net/ljt2724960661/article/details/127524580