TextView实现原理分析

TextView 是 Android 中用于显示文本的核心组件,它的实现原理涉及多个方面,包括文本渲染、布局计算、滚动支持等。下面,我将结合源码分析 TextView 的关键实现细节。

1. 构造和初始化

TextViewView 的子类,同时继承自 AppCompatTextViewMaterialTextView,这些类又继承自 android.widget.TextView。在构造函数中,TextView 会初始化其样式、属性和事件监听器。

1public TextView(Context context) {
2    this(context, null);
3}
4
5public TextView(Context context, AttributeSet attrs) {
6    this(context, attrs, android.R.attr.textViewStyle);
7}
8
9public TextView(Context context, AttributeSet attrs, int defStyleAttr) {
10    super(context, attrs, defStyleAttr);
11    init(null, attrs, defStyleAttr, 0);
12}

init 方法中,TextView 会加载默认的样式属性,初始化各种内部变量,以及设置文本颜色、大小、字体等。

2. 文本渲染

TextView 使用 Paint 对象来渲染文本。Paint 的配置包括字体大小、字体类型、文本颜色等。TextViewonDraw 方法负责绘制文本。

1@Override
2protected void onDraw(Canvas canvas) {
3    super.onDraw(canvas);
4    drawText(canvas);
5}

drawText 方法会使用 PaintCanvas 来绘制文本,具体实现依赖于 BaseTextView 类中的 drawText 方法。

3. 文本布局

TextView 的文本布局由 StaticLayoutDynamicLayout 完成,具体取决于文本是否可滚动。布局计算会考虑到文本的宽度、高度、对齐方式等因素。

1void createLayout() {
2    CharSequence text = getText();
3    TextPaint paint = getPaint();
4    Layout layout = getLayout();
5    if (layout == null || layout.getText() != text || layout.getPaint() != paint) {
6        Layout newLayout = createLayout(text, paint);
7        if (newLayout != null) {
8            setLayout(newLayout);
9        }
10    }
11}

createLayout 方法会创建一个新的 Layout 对象,这个对象负责文本的实际布局。Layout 类提供了对文本行的计算和管理。

4. 测量和布局

TextViewonMeasure 方法中计算其所需的宽度和高度,以便正确地显示文本。

1@Override
2protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
3    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
4    checkForRelayout();
5    if (mNeedsLayout) {
6        mNeedsLayout = false;
7        if (mLayout == null || mTextDirHelper != null && mTextDirHelper.mTextDirectionChanged) {
8            createLayout();
9        }
10        measureContent(widthMeasureSpec, heightMeasureSpec);
11    }
12}

measureContent 方法会调用 getLayout().getDesiredWidth()getLayout().getHeight() 来获取文本的推荐宽度和高度,然后使用这些值来设置 TextView 的测量尺寸。

5. 滚动支持

当文本超出 TextView 的边界时,TextView 提供了滚动支持。这通过 ScrollerOverScroller 实现,允许用户通过触摸手势来滚动文本。

1@Override
2public boolean onTouchEvent(MotionEvent event) {
3    if (mScroller.isFinished() && !mScroller.springBack(0, 0, 0, 0, 0, 0)) {
4        mScroller.startScroll(0, 0, 0, 0);
5        invalidate();
6    }
7    return super.onTouchEvent(event);
8}

总结

TextView 的实现原理涉及文本渲染、布局计算、测量、绘制和滚动等多个环节。它通过 PaintLayout 对象来处理文本的视觉呈现,通过 onMeasureonLayout 方法来处理大小和位置的计算,以及通过 onTouchEvent 和滚动相关的方法来处理用户交互。这些机制共同协作,使得 TextView 成为 Android 应用中显示文本的强大工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QXlsx读写excel

QXlsx读写excel 安装 QXlsx使用 qmake使用 CMake 基本用法1. 写入 Excel 文件2. 读取 Excel 文件 详细用法1. 设置单元格样式2. 合并单元格3. 创建图表4. 设置列宽和行高 完整示例 QXlsx 是一个用于在 Qt 应用中读写 Excel 文件的第三方库。它提供了丰富的 API,可以…

Android Studio关于Gradle及JDK问题解决

1.Android Studio 版本如:Android Studio Koala | 2024.1.1 2.Gradle 版本为:8.7 3.JDK 版本为:17 以上这三个必须匹配,具体可以看官网Android Studio 版本说明(https://developer.android.google.cn/studio?hlzh-…

autoware.universe源码略读(3.17)--perception:occupancy_grid_map_outlier_filter

autoware.universe源码略读3.17--perception:occupancy_grid_map_outlier_filter Overview(Class)RadiusSearch2dfilter(Class Constructor)RadiusSearch2dfilter::RadiusSearch2dfilter(mFunc)RadiusSearc…

2月科研——arcgis计算植被差异

ArcGIS中&#xff0c;设置高于或低于某个值的像元为 -9999&#xff0c;然后将这些地方设为空——目的&#xff1a;去除异常值和黑色背景值 Con(("T_std ano7.tif" > 2) | ("T_std ano7.tif" < - 2), - 9999,"T_std ano7.tif") SetNull(&…

python基础语法 007 文件操作-1读取写入

1 文件操作 1.1 什么时候用文件操作&#xff1f; 打开文档写东西看东西拿文档做统计 在python 文档操作作用 存储数据读取数据 打开文件有什么用&#xff1f; 读取数据&#xff0c;写入数据不管什么数据都可以用open打开&#xff0c;如可复制一张图片 1.2 open() 读取,…

c++中的冒泡排序(Bubble Sort),插入排序(Insertion Sort)和选择排序(Selection Sort)

前言 hello大家好啊&#xff0c;这里是文宇&#xff0c;不是文字&#xff0c;是文宇哦。今天开始爆更 冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它属于比较排序算法的一种。冒泡排序的基本…

Java开发利器:深入浅出`java.util.Objects`

在Java开发过程中&#xff0c;java.util.Objects作为一个不可或缺的工具类&#xff0c;为开发者提供了诸多实用方法&#xff0c;用以简化对象操作、提升代码健壮性和可读性。本文将详尽介绍Objects类中的几个核心方法及其应用场景&#xff0c;帮助你更好地驾驭Java编程。 前言…

C++顶层const和底层const

《Cprimer》中写到&#xff1a;顶层const表示指针本身是个常量&#xff0c;底层const表示指针所指的对象是一个常量。 顶层const可以表示任意的对象是常量&#xff0c;这一点对任何数据类型都适用。底层const则与指针和引用等复合类型的基本类型部分有关&#xff0c;比较特殊的…

【嵌入式DIY实例-ESP8266篇】-LCD ST7789显示BMP280传感器数据

LCD ST7789显示BMP280传感器数据 文章目录 LCD ST7789显示BMP280传感器数据1、硬件准备与接线2、代码实现在本文中,将介绍如何通过 ESP8266 NodeMCU 开发板 (ESP-12E) 与 ST7789 TFT 显示屏连接。 在此项目中,我们将了解如何将 ESP8266 NodeMCU 板与 Bosch Sensortec 的 BMP2…

OpenAI发布迷你AI模型GPT-4o mini

本心、输入输出、结果 文章目录 OpenAI发布迷你AI模型GPT-4o mini前言OpenAI发布迷你AI模型GPT-4o mini英伟达联合发布 Mistral-NeMo AI 模型:120 亿参数、上下文窗口 12.8 万个 tokenOpenAI发布迷你AI模型GPT-4o mini 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csd…

多视角多对学习方式的相关论文解读

目标解决问题&#xff1a; 1&#xff1b;地理分布的空气质量和天气站是异质的空间对象&#xff0c;它们监测的条件不同。现有的方法通常设计用于同质的空间对象&#xff0c;不适合联合预测。 2&#xff1b;观察误差累积&#xff1a;监测站的观测数据往往因传感器误差和环境干扰…

如何在 Nginx 中配置访问日志的格式?

文章目录 如何在 Nginx 中配置访问日志的格式&#xff1f;一、Nginx 访问日志的重要性二、Nginx 访问日志的默认格式三、自定义 Nginx 访问日志格式四、配置访问日志的存储路径五、实际应用场景与示例场景一&#xff1a;电商网站场景二&#xff1a;多语言网站场景三&#xff1a…

Win10+Docker配置TensorRT环境

1.Docker下载和安装 Docker下载:Install Docker Desktop on Windows Docker安装: 勾选直接下一步就行,安装完成后需要电脑重启。 重启后,选择Accept—>Continue without signing in—>skip survey. 可以进入下面页面,并且左下角是绿色的,显示e…

用Python写一个视频采集脚本,对某网站进行批量采集

最近某牙上又出现一批高质量视频&#xff0c;听说删的很快&#xff0c;还好我会Python&#xff0c;赶紧采集下来保存&#xff01; 准备工作 环境使用 Python 3.10 解释器 Pycharm 编辑器 模块使用 requests >>> 数据请求模块 re <正则表达式模块> os <文…

unittest框架和pytest框架区别及示例

unittest框架和pytest框架区别及示例 类型unittest框架pytest框架unittest框架示例pytest框架示例安装python内置的一个单元测试框架,标准库&#xff0c;不需要安装第三方单元测试库&#xff0c;需要安装使用时直接引用 import unittest安装命令&#xff1a;pip3 install pyte…

matlab 声音信号希尔伯特黄变换

1、内容简介 略 91-可以交流、咨询、答疑 2、内容说明 略 Hilbert-Huang变换&#xff08;HHT&#xff09;是一种基于经验的数据分析方法 方法。它的扩展基础是自适应的&#xff0c;因此它可以从非线性和非平稳过程中产生具有物理意义的数据表示。这个 适应性的优势是有代价…

加入更多的功能,我需要随便输入一个 我今天的工作 ,它能自动分类到 其中一个,例如 “编程” 它会自动分类到 工作

为了实现更智能的分类&#xff0c;我们需要改进分类器&#xff0c;使其能够处理用户输入的任意文本&#xff0c;并自动分类到相应的类别。可以通过增加训练数据并改进数据预处理和分类器训练来实现这一点。 改进步骤 增加训练数据&#xff1a;增加更多样化的训练数据&#xf…

算法——双指针(day4)

15.三数之和 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 这道题目说是三数之和&#xff0c;其实这和我们之前做过的两数之和是一个规律的~无非就是我们需要实时改动target的值。先排好序&#xff0c;然后固定一个数取其负值作target&#xf…

【MySQL进阶之路 | 高级篇】GROUP BY优化,分页查询优化

1. GROUP BY优化 group by使用的索引的原则几乎跟order by一致&#xff0c;即使没有过滤条件用到索引&#xff0c;也可以直接使用索引。 group by先排序再分组&#xff0c;遵循索引建立的最佳左前缀原则 当无法使用索引列&#xff0c;增大max_length_for_sort_data和sort_buf…

【Linux 驱动】IMX6ULL eLCDIF驱动

1. eLCDIF设备树 lcdif: lcdif021c8000 {compatible "fsl,imx6ul-lcdif", "fsl,imx28-lcdif"; //属性reg <0x021c8000 0x4000>; //起始地址 地址大小interrupts <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; …