从零学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版本开始, ...
随机推荐
- Leetcode506.Relative Ranks相对名次
给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌.前三名运动员将会被分别授予 "金牌","银牌" 和" 铜牌"(" ...
- TZ_14_Zuul网关
1.spring-cloud的微服务大致是 2.zuul是 Netflix开源的微服务网关, 它可以和 Eureka. Ribbon. Hystrix等组件配合使用.zul的核心是一系列的过滤器,这些 ...
- CentOS7 下的 firewall 用法
1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disab ...
- 你需要一个新的model实体的时候必须new一个.奇怪的问题: 使用poi解析Excel的把数据插入数据库同时把数据放在一个list中,返回到页面展示,结果页面把最后一条数据显示了N次
数据库显示数据正常被插 插入一条打印一次数据,也是正常的,但是执行完,list就全部变成了最后一条数据.很奇怪 单步调试 给list插入第一条数据 model是6607 连续插了多条数据都是6607 ...
- Python网络爬虫与信息提取[request库的应用](单元一)
---恢复内容开始--- 注:学习中国大学mooc 嵩天课程 的学习笔记 request的七个主要方法 request.request() 构造一个请求用以支撑其他基本方法 request.get(u ...
- cron服务
相对与at,cron的优点就是能够周期性的执行某个命令,at却只能执行一次,cron的后台进程名字是crond ,cron也是system V的服务,所以我们可以service crond start ...
- 区间加值,区间gcd, 牛客949H
牛客小白月赛16H 小阳的贝壳 题目链接 题意 维护一个数组,支持以下操作: 1: 区间加值 2: 询问区间相邻数差的绝对值的最大值 3: 询问区间gcd 题解 设原数组为\(a\), 用线段树维护\ ...
- SASS在HTML5移动应用开发中的应用方法
一.什么是SASS SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.二.安装和使用 2.1 安装 SA ...
- 让Drewtech的J2534 ToolBox 软件支持任何J2534的设备
更改windows注册表中的FunctionLibrary和ConfigApplication,将DLL和exe路径替换原来的,其他不要动. 或者 create second key in regis ...
- C++ 实现十大排序算法
教你手撕排序,这里有一个概念就是稳定排序.假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前, ...