在React Native开发中,所有需要显示的字符串文本都需要放置在Text或者Text的子组件中。虽然在之前的文章中多次使用了Text组件,但是Text组件还是值得专门学习的, 并没有想象中的那么简单。

任何一个组件,都有样式和属性,样式一般约束控件的样式和位置,定义在style属性中。属性就是直接声明在控件上。

Text样式

Text组件支持View的所有样式键。但是需要注意的是,Text内部的元素不再使用flexBox布局,而是采用文本布局。 这意味着Text组件内部的元素不再是一个个的矩形,组件内部元素排列出组件末端时会自动另起一行。

所以开发者可以不用设定Text控件的高度,一般情况也没有必要设定,Text组件的高度将由Text组件的宽度,需要显示的字符串长度,字体大小共同来决定。

Text组件中显示的字符串只有一行,并且我们设置了Text组件的高度,这个高度比字体大很多,字符串会贴着组件上边显示, 因为不支持flexBox布局, 无法让它调整到垂直方向居中显示. 我们只能通过在字符串前面 加{\r\n} 让字符串前加空行的形式凑到居中显示.

了解了上面的特性, 后面我们会介绍一些实际中的解决办法。 介绍之前我们先来看看Text常用的样式键.

样式键名 描述
color 字体颜色, 和其它位置的颜色类型一样
fontFamily 字体名称
fontSize 字体大小
fontStyle 字体风格, 可选值 ‘normal’,’italic’ ,分别代表正常和斜体。
fontWeight 字体粗细权重(“normal”, ‘bold’, ‘100’, ‘200’, ‘300’, ‘400’, ‘500’, ‘600’, ‘700’, ‘800’, ‘900’) normal和bold就是平时说的正常字体与粗体,后面的9个数字从最细(100) 到最粗(900) 每一个数字定义的都要比上一个等级粗一些.
textShadowOffset 设置阴影效果{width: number, height: number}
textShadowRadius 阴影效果圆角
textShadowColor 阴影效果的颜色
letterSpacing 字符间距
lineHeight 行高
textAlign 文本对其方式(“auto”, ‘left’, ‘right’, ‘center’, ‘justify’) , 默认是auto。justify只有ios支持。
textDecorationLine 横线位置 (“none”, ‘underline’, ‘line-through’, ‘underline line-through’)
textDecorationStyle 线的风格(“solid”, ‘double’, ‘dotted’, ‘dashed’)
textDecorationColor 线的颜色
writingDirection 文本方向(“auto”, ‘ltr’, ‘rtl’) 一般不需要更改

Text属性

  1. numberOfLines , 数值类型表示Text字符串可以显示多少行
  2. onLayout 与之前的一样,当布局改变的时候调用, 对应一个函数,参数为{nativeEvent: {layout: {x, y, width, height}}}
  3. onPress, onLongPress 按下事件和长按事件 , 因为没有触摸反馈效果, 不推荐使用
  4. ellipsizeMode , 最新版本推出的属性, 显示不完全省略的位置, 一般配合numberOfLines 使用。 可选值'head', 'middle', 'tail', 'clip', clip 只能在ios中使用, tail是默认值, 省略尾巴 显示方式如:”abcd…”

Text组件嵌套

在iOS或Android当中,显示一个格式化文本的方法就是使用NSAttributedString(IOS)或者SpannableString(Android) ,并且使用范围标注来指定一些格式。这种用法非常繁琐。在React Native中,采用和Web一致的设计,这样你可以把相同格式的文本嵌套包裹起来:

  1. import React, { Component } from 'react';
  2. import {
  3. AppRegistry,
  4. Text,
  5. } from 'react-native';
  6. class AwesomeProject extends Component {
  7. render() {
  8. return (
  9. <Text style={{fontWeight: 'bold'}}>
  10. I am bold
  11. <Text style={{color: 'red'}}>
  12. and red
  13. </Text>
  14. </Text>
  15. );
  16. }
  17. }
  18. AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

运行结果:



子Text组件将继承它父Text组件的样式。 当使用嵌套的Text组件时, 子Text组件不能覆盖从父Text组件继承而来的样式 ,只能增加父Text组件没有指定的样式.

在IOS中, 你还可以在Text组件中嵌套View组件,

  1. import React, { Component } from 'react';
  2. import { AppRegistry, Text, View } from 'react-native';
  3. class BlueIsCool extends Component {
  4. render() {
  5. return (
  6. <Text>
  7. There is a blue square
  8. <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
  9. in between my text.
  10. </Text>
  11. );
  12. }
  13. }
  14. AppRegistry.registerComponent('BlueIsCool', () => BlueIsCool);

运行结果:



Android端虽然暂时不能插入View组件, 但是Android和IOS都可以在Text组件中更方便的插入图像。

  1. import React, { Component } from 'react';
  2. import {
  3. AppRegistry,
  4. StyleSheet,
  5. Text,
  6. Image
  7. } from 'react-native';
  8. class AwesomeProject extends Component {
  9. render() {
  10. return (
  11. <Text style={{fontWeight: 'bold'}}>
  12. I am bold
  13. <Text style={{color: 'red'}}>
  14. <Image source={require('./image/big_star.png') } style={styles.imageInTextStyle}/>and red
  15. </Text>
  16. </Text>
  17. );
  18. }
  19. }
  20. const styles = StyleSheet.create({
  21. imageInTextStyle:{
  22. width:30,
  23. height:30,
  24. resizeMode:'cover'
  25. }
  26. });
  27. AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

阴影效果

React Native 0.18版本开始, Text组件支持阴影效果.需要三个样式键: textShadowOffset,textShadowRadius,textShadowColor。参考下面代码:

  1. import React, { Component } from 'react';
  2. import {
  3. AppRegistry,
  4. StyleSheet,
  5. Text,
  6. } from 'react-native';
  7. //导入自定义组件
  8. class AwesomeProject extends Component {
  9. render() {
  10. return (
  11. <Text style={styles.baseStyle}>
  12. I am bold
  13. <Text style={{color: 'red'}}>
  14. and red
  15. </Text>
  16. </Text>
  17. );
  18. }
  19. }
  20. const styles = StyleSheet.create({
  21. baseStyle: {
  22. fontSize: 20,
  23. textAlign: 'center',
  24. color:'black',
  25. textShadowColor:'grey', // 阴影颜色
  26. textShadowOffset:{width:5,height:5}, //阴影偏移量
  27. textShadowRadius:2, // 阴影半径
  28. fontWeight:'bold'
  29. }
  30. });
  31. AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

效果:

文本垂直居中

上面我们介绍了, Text内部不使用FlexBox布局,我们只能通过其它方式让Text垂直居中.

先来看看下面的例子,

  1. import React, { Component } from 'react';
  2. import {
  3. AppRegistry,
  4. StyleSheet,
  5. Text,
  6. View
  7. } from 'react-native';
  8. class AwesomeProject extends Component {
  9. render() {
  10. return (
  11. <View style={styles.container}>
  12. <Text style={styles.textStyle}>
  13. 让我垂直居中
  14. </Text>
  15. </View>
  16. );
  17. }
  18. }
  19. const styles = StyleSheet.create({
  20. container: {
  21. flex: 1,
  22. justifyContent: 'center',
  23. alignItems: 'center'
  24. },
  25. textStyle: {
  26. height: 100,
  27. width: 200,
  28. fontSize: 30,
  29. backgroundColor: 'grey',
  30. textAlign: 'center', //
  31. justifyContent: 'center',// 主轴(该位置为垂直方向)居中, 但是不生效
  32. margin: 5
  33. }
  34. });
  35. AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);

运行结果:

可以看到上面文字并没有垂直居中. 上面并不是正确的方式, 正确的做法就是让View组件包裹Text组件, 除了FontSize之外的样式全部定义在View组件中, 来看代码:

  1. ...
  2. class AwesomeProject extends Component {
  3. render() {
  4. return (
  5. <View style={styles.container}>
  6. <View style={styles.viewStyle}>
  7. <Text style={styles.textStyle}>
  8. 让我垂直居中
  9. </Text>
  10. </View>
  11. </View>
  12. );
  13. }
  14. }
  15. const styles = StyleSheet.create({
  16. container: {
  17. flex: 1,
  18. justifyContent: 'center',
  19. alignItems: 'center'
  20. },
  21. textStyle: {
  22. fontSize: 30
  23. },
  24. viewStyle: {
  25. height: 100,
  26. width: 200,
  27. alignItems: 'center',
  28. justifyContent: 'center',
  29. backgroundColor: 'gray',
  30. margin: 5
  31. }
  32. });
  33. ...

运行结果:



这样我们就做到了垂直居中了

两个平台不同的表现

Android和IOS 两个平台的Text表现略有区别, 如果字体需要加边框, Android端不生效, 需要在Android端的用View包裹Text, 让View实现边框。

Text组件在Android端高度大约为FontSize的1.35倍, IOS端为1.2倍

更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。

从零学React Native之10Text的更多相关文章

  1. 从零学React Native之11 TextInput

    TextInput 组件是用来通过键盘输入文字,可以使用View组件和Text组件样式,没有自己特定的样式. 与Text组件类似,TextInput组件内部的元素不再使用FlexBox布局,而采用文本 ...

  2. 从零学React Native之13 持久化存储

    数据持久化就是指应用程序将某些数据存储在手机存储空间中. 借助native存储 这种方式不言而喻,就是把内容传递给native层,通过原生API存储,详见从零学React Native之05混合开发 ...

  3. 从零学React Native之03页面导航

    之前我们介绍了RN相关的知识: 是时候了解React Native了 从零学React Native之01创建第一个程序 从零学React Native之02状态机 本篇主要介绍页面导航 上一篇文章给 ...

  4. 从零学React Native之02状态机

    本篇文章首发于简书 欢迎关注 之前我们介绍了RN相关的知识: 是时候了解React Native了 从零学React Native之01创建第一个程序 本篇文章主要介绍下下面的知识: 1.简单界面的搭 ...

  5. 从零学React Native之04自定义对话框

    本篇主要介绍: 1. 自定义组件 2. Alert 对话框 自定义对话框 之前的我都是利用React Native提供的基础组件对它们进行排列组合, 其实自定义也很简单, 我们还是拿上一篇文章的例子进 ...

  6. 从零学React Native之14 网络请求

    通过HTTP或者HTTPS协议与网络侧服务器交换数据是移动应用中常见的通信方式. node-fetch是RN推荐的请求方式. React Native框架在初始化项目时, 引入了node-fetch包 ...

  7. 从零学React Native之12 组件的生命周期

    一个React Native组件从它被加载,到最终被卸载会经历一个完整的生命周期.所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键. ES6语法和之前的ES5 ...

  8. 从零学React Native之08Image组件

    开发过程中, 几乎每个项目都会用到图片. RN就是通过Image组件显示图片.既可以加载网络图片,也可以加载本地资源图片. Image组件必须在样式中声明图片的款和高.如果没有声明,则图片将不会被呈现 ...

  9. 从零学React Native之07View

    View 组件是React Native最基本的组件.绝大部分其他React Native 组件. View组件的颜色和边框 backgroundColor 键用来指定颜色. RN 0.19版本开始, ...

随机推荐

  1. Luogu P1712 [NOI2016]区间(线段树)

    P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...

  2. python 发送邮件短信封装

    发送邮件 需要开启163的smtp服务 import smtplib from email.mime.text import MIMEText class MailSender(): def __in ...

  3. java opencv 4.0.1安装配置

    如果没有把dll扔到jdk会报错 Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no ...

  4. springmvc框架通过web.xml配置404 500错误导向页

    总不能用户输错了url就弹 这玩意吧? <error-page> <error-code>404</error-code> <location>/WEB ...

  5. jnhs[未解决]无法使用选定的hibernate配置文件建立数据库连接.请验证hibernate.cfg.xml中的数据库连接详情信息

    工程可以正常的使用读写数据库,当然model和model.hbm.xml文件是自己写的. 解决中

  6. MySQL错误1055

    问题描述:在MySQL数据库下,执行SQL插入语句报错.错误信息如下: 错误原因:在MySQL5.7之后,sql_mode中默认存在ONLY_FULL_GROUP_BY,SQL语句未通过ONLY_FU ...

  7. mysql 查询条件不区分大小写问题

    转自 http://blog.csdn.net/qishuo_java/article/details/40118937 转自 https://www.cnblogs.com/wuyun-blog/p ...

  8. 2017-09-23-ArchData

    layout: post title: ArchData category: Technical tags: [分布式,区块链,AI,大数据] ArchData 技术峰会 神经网络和函数式编程 杨博: ...

  9. 有趣的HTML5 Web SQL 数据库

    Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs. 核心方法 以下是规范中定义的三个核心方法: openD ...

  10. 阿里云Global Connection亮相MWC 2019,做企业全球化开路先锋

    上周在巴塞罗那举行的MWC 2019世界移动通信大会上,阿里云发布了包含Global Connection解决方案在内的7款重量级产品和解决方案,为全球企业提供了基于阿里云的智能化企业数字转型思路.G ...