从零学React Native之10Text
在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属性
- numberOfLines , 数值类型表示Text字符串可以显示多少行
- onLayout 与之前的一样,当布局改变的时候调用, 对应一个函数,参数为
{nativeEvent: {layout: {x, y, width, height}}}
- onPress, onLongPress 按下事件和长按事件 , 因为没有触摸反馈效果, 不推荐使用
- ellipsizeMode , 最新版本推出的属性, 显示不完全省略的位置, 一般配合numberOfLines 使用。 可选值
'head', 'middle', 'tail', 'clip'
, clip 只能在ios中使用, tail是默认值, 省略尾巴 显示方式如:”abcd…”
Text组件嵌套
在iOS或Android当中,显示一个格式化文本的方法就是使用NSAttributedString(IOS)或者SpannableString(Android) ,并且使用范围标注来指定一些格式。这种用法非常繁琐。在React Native中,采用和Web一致的设计,这样你可以把相同格式的文本嵌套包裹起来:
import React, { Component } from 'react';
import {
AppRegistry,
Text,
} from 'react-native';
class AwesomeProject extends Component {
render() {
return (
<Text style={{fontWeight: 'bold'}}>
I am bold
<Text style={{color: 'red'}}>
and red
</Text>
</Text>
);
}
}
AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);
运行结果:
子Text组件将继承它父Text组件的样式。 当使用嵌套的Text组件时, 子Text组件不能覆盖从父Text组件继承而来的样式 ,只能增加父Text组件没有指定的样式.
在IOS中, 你还可以在Text组件中嵌套View组件,
import React, { Component } from 'react';
import { AppRegistry, Text, View } from 'react-native';
class BlueIsCool extends Component {
render() {
return (
<Text>
There is a blue square
<View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
in between my text.
</Text>
);
}
}
AppRegistry.registerComponent('BlueIsCool', () => BlueIsCool);
运行结果:
Android端虽然暂时不能插入View组件, 但是Android和IOS都可以在Text组件中更方便的插入图像。
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
Image
} from 'react-native';
class AwesomeProject extends Component {
render() {
return (
<Text style={{fontWeight: 'bold'}}>
I am bold
<Text style={{color: 'red'}}>
<Image source={require('./image/big_star.png') } style={styles.imageInTextStyle}/>and red
</Text>
</Text>
);
}
}
const styles = StyleSheet.create({
imageInTextStyle:{
width:30,
height:30,
resizeMode:'cover'
}
});
AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);
阴影效果
React Native 0.18版本开始, Text组件支持阴影效果.需要三个样式键: textShadowOffset,textShadowRadius,textShadowColor。参考下面代码:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
} from 'react-native';
//导入自定义组件
class AwesomeProject extends Component {
render() {
return (
<Text style={styles.baseStyle}>
I am bold
<Text style={{color: 'red'}}>
and red
</Text>
</Text>
);
}
}
const styles = StyleSheet.create({
baseStyle: {
fontSize: 20,
textAlign: 'center',
color:'black',
textShadowColor:'grey', // 阴影颜色
textShadowOffset:{width:5,height:5}, //阴影偏移量
textShadowRadius:2, // 阴影半径
fontWeight:'bold'
}
});
AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);
效果:
文本垂直居中
上面我们介绍了, Text内部不使用FlexBox布局,我们只能通过其它方式让Text垂直居中.
先来看看下面的例子,
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View
} from 'react-native';
class AwesomeProject extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.textStyle}>
让我垂直居中
</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
textStyle: {
height: 100,
width: 200,
fontSize: 30,
backgroundColor: 'grey',
textAlign: 'center', //
justifyContent: 'center',// 主轴(该位置为垂直方向)居中, 但是不生效
margin: 5
}
});
AppRegistry.registerComponent('AwesomeProject', () => AwesomeProject);
运行结果:
可以看到上面文字并没有垂直居中. 上面并不是正确的方式, 正确的做法就是让View组件包裹Text组件, 除了FontSize之外的样式全部定义在View组件中, 来看代码:
...
class AwesomeProject extends Component {
render() {
return (
<View style={styles.container}>
<View style={styles.viewStyle}>
<Text style={styles.textStyle}>
让我垂直居中
</Text>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
textStyle: {
fontSize: 30
},
viewStyle: {
height: 100,
width: 200,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'gray',
margin: 5
}
});
...
运行结果:
这样我们就做到了垂直居中了
两个平台不同的表现
Android和IOS 两个平台的Text表现略有区别, 如果字体需要加边框, Android端不生效, 需要在Android端的用View包裹Text, 让View实现边框。
Text组件在Android端高度大约为FontSize的1.35倍, IOS端为1.2倍
更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。
从零学React Native之10Text的更多相关文章
- 从零学React Native之11 TextInput
TextInput 组件是用来通过键盘输入文字,可以使用View组件和Text组件样式,没有自己特定的样式. 与Text组件类似,TextInput组件内部的元素不再使用FlexBox布局,而采用文本 ...
- 从零学React Native之13 持久化存储
数据持久化就是指应用程序将某些数据存储在手机存储空间中. 借助native存储 这种方式不言而喻,就是把内容传递给native层,通过原生API存储,详见从零学React Native之05混合开发 ...
- 从零学React Native之03页面导航
之前我们介绍了RN相关的知识: 是时候了解React Native了 从零学React Native之01创建第一个程序 从零学React Native之02状态机 本篇主要介绍页面导航 上一篇文章给 ...
- 从零学React Native之02状态机
本篇文章首发于简书 欢迎关注 之前我们介绍了RN相关的知识: 是时候了解React Native了 从零学React Native之01创建第一个程序 本篇文章主要介绍下下面的知识: 1.简单界面的搭 ...
- 从零学React Native之04自定义对话框
本篇主要介绍: 1. 自定义组件 2. Alert 对话框 自定义对话框 之前的我都是利用React Native提供的基础组件对它们进行排列组合, 其实自定义也很简单, 我们还是拿上一篇文章的例子进 ...
- 从零学React Native之14 网络请求
通过HTTP或者HTTPS协议与网络侧服务器交换数据是移动应用中常见的通信方式. node-fetch是RN推荐的请求方式. React Native框架在初始化项目时, 引入了node-fetch包 ...
- 从零学React Native之12 组件的生命周期
一个React Native组件从它被加载,到最终被卸载会经历一个完整的生命周期.所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键. ES6语法和之前的ES5 ...
- 从零学React Native之08Image组件
开发过程中, 几乎每个项目都会用到图片. RN就是通过Image组件显示图片.既可以加载网络图片,也可以加载本地资源图片. Image组件必须在样式中声明图片的款和高.如果没有声明,则图片将不会被呈现 ...
- 从零学React Native之07View
View 组件是React Native最基本的组件.绝大部分其他React Native 组件. View组件的颜色和边框 backgroundColor 键用来指定颜色. RN 0.19版本开始, ...
随机推荐
- [BZOJ2729]排队
数学知识 排列 A(n,m)从n个元素中选出m个的不同的排列数 A(n,m)=n!/(n-m)! 组合 C(n,m)从n个元素中选出m个的不同的方案数 C(n,m)=n!/(m!*(n-m)! ...
- Django项目:CRM(客户关系管理系统)--37--29PerfectCRM实现King_admin编辑自定义限制
#base_admin.py # ————————24PerfectCRM实现King_admin自定义操作数据———————— from django.shortcuts import render ...
- textarea限定字符输入及提示
html <textarea type="text" name="goodsDesc" data-varify='goods' placeholder=& ...
- jeecms使用小结
前言: 使用jeecmsV9已经有一段时间,现在PC端的二次开发基本进入尾声,手机端的开发即将开始 ,由于项目时间比较紧,开发时不是每个人都会使用它自带的标签,所以在PC端开发的时候浪费了大量时间,为 ...
- MySQL下载安装详情教程(Windows)
1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载 ...
- JAVA获取磁盘空间
需要把磁盘空间显示在页面上,这样就不用去服务器查看了,方便 两个办法 File file = new File("D:"); long totalSpace = file.getT ...
- ModelAndView返回mav时,报404
报404的可能性太多了 简单来看,404后边有信息,说明请已经分配到了控制器 经过调试发现,mav已经分配到了页面 原因,modelandview的包导入错误,正确的包是 import org.spr ...
- Linux下根目录root扩容
参考博客:https://blog.csdn.net/qq_36527339/article/details/81772996 1.首先虚拟机关机 —> 选中要扩容的虚拟机 —>编辑虚拟机 ...
- Oracle JOB的建立,定时执行任务
Oracle JOB的建立,定时执行任务 oracle job的相关设置 next date: 2010-12-28 18:05:00 interval: to_date(to_char(sysdat ...
- UE4物理模块(一)---概述与可视化调试
UE4.21前的版本采用的是NVIDIA的PhysX做为其默认的物理引擎,用于计算3D世界的碰撞查询与物理模拟.自4.21版本开始改物理调用接口,但这并不是闲来重构代码,果然在2019GDC大会上放出 ...