最近做列表优化时, 看到TextView的setText竟然也很耗时, 因为每次都要重新为新的显示内容计算换行如何换行.
想着把这部分工作放在非UI线程中做, 就像LITHO一样.
谷歌想什么呢? 非得把meaure, layout这些耗时操作放在UI线程中吗?
想到对于简单的文本, 自己实现一个view, 通过drawText画出来.
但是遇到了drawText的坐标问题:

对于一段文字来说,如果你想把他画到Canvas上,首先你要确定这段文字的范围,即宽度和高度,那么怎么去取这一段的高度呢,如果你在网上搜,会有很多种答案,具体应该用哪一种呢?这要看你到底需要什么样的尺寸了。
Paint.getTextBounds: 当你通过这个方法来获取尺寸的时候,你可以得到能够包裹文字的最小矩形,就是图中红色边框的那部分,你可以得到一个Rect对象,包含这个最小尺寸的几个值。坑其实就在这里:这里的Rect对象坐标并不是以左上角为准的,而是相对于左边中间靠下位置的一个点,就是图中的黄色五角星。而这里水平的Baseline指的是字符串对齐的一条线。既然这样,r.top就是一个负值了,r.bottom会是一个小一点的正值,r.left和r.right在图中画的都很清楚。通过r.width()和r.height()来获取尺寸。
那么文字的偏移就好说了,比如说你要把文字画在Canvas的左上角,坐标是(0,0),但是当你通过:
canvas.drawText(“dangwen”,0,0,paint);
来画文字的时候,发现只有文字的下半部分画出来了,因为你传递进去的参数应该是以Baseline为标准的,正确的方法是:
canvas.drawText(“dangwen”,-r.left,-r.top,paint);
Paint.getFontMetricsInt(): 当你通过这里方法来获取尺寸的时候,你获取的只是一个垂直方向上的尺寸,这里的ascent代表的是字体的上部,descent代表的是字体的下部,这里需要注意的是这和上面获得的Rect的top和bottom不太一样,他们比比ascent和descent距离稍微小一些,这些具体的高度可能和不同的字体和渲染方式有关系,这里就不深入了 #我是不懂#。
然后如果把文字写入TextView(图中蓝色部分)并且设置TextView的高度和宽度设为wrap_content,那么TextView的高度就正好是FontMetricsInt.top – FontMetricsInt.bottom, 那宽度呢? Paint.measureText()。

canvas高度问题_Android的drawText的坐标问题相关推荐

  1. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)

    秦子帅明确目标,每天进步一点点..... 作者 |  andy 地址 |  blog.csdn.net/Andy_l1/article/details/82910061 1.概述 自定义View对需要 ...

  2. android 清空canvas部分内容_Android自定义View实现圆形头像效果

    在我们的APP中通常会遇到,展示圆形头像的需求,一般通过Glide就能实现,但是让我们做一个圆形头像,如果让我们自定义实现这种效果,该怎样做呢? 好,接下来本文通过三种方式来实现这种效果! 注意:这是 ...

  3. android canvas光晕绘制_android用canvas绘制两种波纹效果

    波形效果有几种不同的呈现形式,比如从中间向四周散开的波形,也就是熟知的水涟漪:还有上下波动的曲线,像五线谱等.英文中可以称作Wave或者Ripple,所以暂且叫它们WaveView.WaveLayou ...

  4. Android Canvas类介绍和Android Draw Rect 坐标图示

    当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...

  5. android canvas光晕绘制_Android 绘制发光效果

    之前在看别人写自定义view作绘制的时候,看到别人家的view自带发光效果,看起来也是蛮炫酷的,于是自己也抽出时间来试用一下,这里做了一个模仿太阳的各种状态样式. 先上效果先上效果: 实现方式: pu ...

  6. bubble html5,利用HTML5 Canvas创建交互式Bubble Chart

    Josh Marinacci也在其博客中详细地介绍了"如何利用HTML5 Canvas创建可以在移动桌面上运行的交互式图表以及如何利用真实数据填充图表."下面让我们跟随作者学习如何 ...

  7. web canvas图片标点 得像素坐标数组

    web前端 在图片上标点 获取坐标 Vue 最近在开发过程中有一个需求: 要在一个不规则的物体图片上画标点,获取所有坐标,然后计算出相对面积. 步骤思路: 用canvas元素,进行导入图片 获取鼠标坐 ...

  8. 有4个圆塔,圆心分别为(2,2)……今输入任一点坐标,求该点坐标建筑物高度。

    有4个互相对称的圆,圆的半径为1,在圆内建筑物高度为10m,否则高度为0m. 可利用对称思想,将横纵坐标取绝对值,这样就只需讨论第一象限的情形. 代码如下: //终曲cc-学习之路 #include ...

  9. Android心电数据分析,Android SurfaceView+Canvas画脉搏/心电数据图-Go语言中文社区

    实际演示效果: Canvas 画图基本步骤: 1.布局添加一个SurfaceView<?xml version="1.0" encoding="utf-8" ...

最新文章

  1. SpringBoot (四) :SpringBoot整合使用JdbcTemplate
  2. 使用PHPExcel将数据导出至Excel
  3. PHP 知识点笔记-常用数据类型
  4. curl下载失败返回0_curl返回常见错误码
  5. Highcharts 环境配置介绍
  6. perform build_lc_user_stat
  7. python 关闭窗口事件_关于python:如何在Tkinter中处理窗口关闭事件?
  8. 在WildFly中将Apache Camel和Spring添加为jboss模块
  9. 简单的实现RAII封装。
  10. android adjust,【报Bug】安卓 adjust-position设置为false 页面依然被顶起 ios是好的
  11. mysql 多实例 独立配置文件_mysql 5.7 配置多实例 — 独立配置文件方式
  12. java 日期for循环_java for循环的时候增加循环体的长度是不是不太好的?
  13. 理解 XML Schema:XML Schema 初步 (I)
  14. java功能模块_Java 13功能
  15. 前端项目如何做测试?
  16. Smart View for Office
  17. 数据可视化BI平台--CBoard的使用
  18. php分页设计美化,国产PHP框架之ThinkPHP各模块开发系列十七,美化分页显示
  19. 三进制计算机_“九章”量子计算机这么猛,到底能做啥?只为了一条公式的结果吗...
  20. 【局域网音频实时传输、屏幕单播及广播】

热门文章

  1. mysql 编译cpu数量_合适MySQL的Xeon 55XX系列CPU编译参数
  2. mycat 10 分钟轻松入门
  3. 微服务资源springboot、springcloud、docker、dubbo项目实战等倾心分享
  4. 【struts2+hibernate+spring项目实战】分页功能的完整的实现(通用分页、基类实现)
  5. 2021-10-11 二叉树中查找值为key的结点
  6. Android Studio的Gradle常用命令配置和依赖管理
  7. ViewFlipper的功能和用法
  8. 【版本工具】SVN-E155036 Working copy ... is too old Please see the ‘svn upgrade‘ command
  9. java实现简单的二叉树ADT
  10. javascript对象和json字符串之间转换的问题