常用却不简单的TextView

疫情概要

国内疫情

5月26日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病例1例,为境外输入病例(在上海);无新增死亡病例;新增疑似病例1例,为境外输入病例(在福建)

国际疫情

截至2020年5月27日12时,全球共215个国家和地区爆发了新冠疫情。除中国外,其他国家新冠病毒感染病例累计确诊555.3万人,累计治愈223.9万人,累计死亡35.0万人。其中,美国累计确诊168.0万人,累计死亡9.9万人。巴西、俄罗斯、英国、西班牙和意大利累计确诊均超20万人。英国、意大利、法国、西班牙和巴西累计死亡均超2万人。

前言

Android开发中TextView是使用频率最高的一个控件,除了能显示文本内容还能展示图片。本篇就记录日常开发中关于TextView的一些特殊或者较少使用却有大用的属性或能力。关于使用TextView显示富文本的相关内容可以转到之前写的文章神奇的TextView-实现富文本,实现了文本、图片加载显示及链接处理。

设置行间距、行高

先看效果

textview-line-height

android:lineHeight / setLineHeight(int)

设置行高,文本高度也包含在内。Added in API level 28

官方文档:

1
2
3
4
5
6
7
8
9
Explicit height between lines of text. If set, this will override the values set for lineSpacingExtra and lineSpacingMultiplier.

May be a dimension value, which is a floating point number appended with a unit such as "`14.5sp`". Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), in (inches), and mm (millimeters).



Related methods:

- `setLineHeight(int)`

翻译过来大致意思是:

指定文本明确的行间距,并且设置了该属性后lineSpacingExtralineSpacingMultiplier将会被覆盖,即失效。设置的值是一个尺寸值,单位可以是px、dp、sp、in、mm。

android:lineSpacingExtra / setLineSpacing(float,float)

设置行间距,文本高度不包含在内。Added in API level 1

官方文档:

1
2
3
4
5
6
7
8
9
Extra spacing between lines of text. The value will not be applied for the last line of text.

May be a dimension value, which is a floating point number appended with a unit such as "`14.5sp`". Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size), in (inches), and mm (millimeters).



**Related methods:**

- `setLineSpacing(float,float)`

翻译过来大致意思是:

指定文本行间距的额外距离(即设置的是不包含文本高度的距离),最后一行不会生效。设置的值是一个尺寸值,单位可以是px、dp、sp、in、mm。

其中Java方法 setLineSpacing(float,float) 为:

1
2
public void setLineSpacing (float add, 
float mult)
Parameters
add float: The value in pixels that should be added to each line other than the last line. This will be applied after the multiplier
mult float: The value by which each line height other than the last line will be multiplied by

第一个入参 add 等同于 xml 中 lineSpacingExtra设置的值,先乘mult值,后加add值;

第二个入参 mult 等同于 xml 中 lineSpacingMultiplier设置的值;

android:lineSpacingMultiplier / setLineSpacing(float,float)

设置行间距的倍数,文本高度不包含在内。Added in API level 1

官方文档:

1
2
3
4
5
6
7
8
9
Extra spacing between lines of text, as a multiplier. The value will not be applied for the last line of text.

May be a floating point value, such as "`1.2`".



**Related methods:**

- `setLineSpacing(float,float)`

翻译过来大致意思是:

指定文本行间距的倍数(即设置的是不包含文本高度的距离倍数),最后一行不会生效。浮点类型。

android:letterSpacing

设置字符间距。Added in API level 21

1
2
3
4
5
6
7
8
9
Text letter-spacing.

May be a floating point value, such as "`1.2`".



**Related methods:**

- `setLetterSpacing(float)`

翻译过来大致意思是:

文本的字符距离。浮点类型。

代码

activity_text_view.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.sample.TextViewActivity">

<!--默认样式-->
<TextView
android:id="@+id/tv_default"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="大家好,我是默认的TextView显示样式。大家好,我是默认的TextView显示样式。大家好,我是默认的TextView显示样式。大家好,我是默认的TextView显示样式"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<!-- android:lineHeight="30dp"-->
<TextView
android:id="@+id/tv_line_height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:lineHeight="30dp"
android:text="大家好,我是设置了lineHeight=30dp的TextView显示样式,使用该属性后lineSpacingExtra和lineSpacingMultiplier都将无效。该属性需要SDK>=28时才能使用"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_default" />

<!-- android:lineSpacingExtra="10dp"-->
<TextView
android:id="@+id/tv_line_space_extra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:lineSpacingExtra="10dp"
android:text="大家好,我是设置了lineSpacingExtra=10dp的TextView显示样式。大家好,我是设置了lineSpacingExtra=10dp的TextView显示样式。"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_line_height" />

<!-- android:lineSpacingMultiplier="1.5"-->
<TextView
android:id="@+id/tv_line_space_multiplier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:lineSpacingMultiplier="1.5"
android:text="大家好,我是设置了lineSpacingMultiplier=1.5的TextView显示样式。大家好,我是设置了lineSpacingMultiplier=1.5的TextView显示样式。"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_line_space_extra" />

<!--android:letterSpacing="0.5"-->
<TextView
android:id="@+id/tv_letter_space"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:letterSpacing="0.5"
android:text="大家好,我是设置了letterSpacing=0.5的TextView显示样式。该属性需要SDK>=21时才能使用"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_line_space_multiplier" />
</android.support.constraint.ConstraintLayout>

TextViewActivity.java

用于展示java内如何设置,效果同activity_text_view.xml内一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//等同于 android:lineHeight="30dp"
TextView tvLineHeight = findViewById(R.id.tv_line_height);
int lineHeight = SizeUtils.dp2px(30);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
tvLineHeight.setLineHeight(lineHeight);
}

//等同于android:lineSpacingExtra="10dp"
TextView tvLineSpacingExtra = findViewById(R.id.tv_line_spacing_extra);
int add = SizeUtils.dp2px(10);
tvLineSpacingExtra.setLineSpacing(add, 1);

//等同于 android:lineSpacingMultiplier="1.5"
TextView tvLineSpacingMultiplier = findViewById(R.id.tv_line_spacing_multiplier);
tvLineSpacingMultiplier.setLineSpacing(0, 1.5f);

//等同于 android:letterSpacing="0.5"
TextView tvLetterSpace = findViewById(R.id.tv_letter_space);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
tvLetterSpace.setLetterSpacing(0.5f);
}

参考

TextView官方文档)

坚持原创技术分享,您的支持是对我最大的鼓励!