React-Native 之控件布局
Nodejs 一度将前端JS 推到了服务器端,而15年FB的React-Native RN再一次将JS 推到了移动端的开发浪潮中。RN的优势这里不再重复,它是我们这些习惯了服务端、web端开发,而又不想去花太多时间掌握Android、IOS移动端原生开发的人员的福音,可以说是我们通向全栈工程师的快速捷径!于是乎最近开始学习React-Native,并将学习中的一些点滴记录下来。
网上关于RN的资料不少了,首先是环境配置,不一定非得Mac 下。我是基于Windows开发的,Windows下环境如何配置大家可以参考这篇文章 Windows下RN环境搭配。准备好开发环境之后就是具体的开发知识学习了。首先是RN控件的学习,这里我们先学习RN的控件布局。
RN的布局采用的是CSS+Flexbox布局方式。我们初始化使用 命令初始化一个名叫reactNative的项目,命令如下:react-native init reactNative。等待完成之后,我们使用WebStorm打开项目,在项目里面的index.android.js文件中插入如下代码:
import React, {Component} from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View
} from 'react-native';
var App = React.createClass({
render: function () {
return (
<View style={styles.main}>
<View style={styles.view1}>
<Text style={styles.text}>Test1</Text>
<Text style={styles.text}>Test2</Text>
<Text style={styles.text}>Test3</Text>
</View>
<View style={styles.view2}>
<Text style={styles.text}>Test4</Text>
<Text style={styles.text}>Test5</Text>
<Text style={styles.text}>Test6</Text>
<Text style={styles.text}>Test7</Text>
<Text style={styles.text}>Test8</Text>
<Text style={styles.text}>Test9</Text>
<Text style={styles.text}>Test10</Text>
</View>
</View>
);
}
})
var styles = StyleSheet.create({
main: {
flex: 1, borderColor: 'blue', margin: 5, borderWidth: 1
},
view1: {
borderColor: 'red', borderWidth: 1, flexDirection: 'column', height: 150
},
view2: {
borderColor: 'red', borderWidth: 1, flexDirection: 'row'
},
text: {
fontSize: 14, margin: 10
}
})
AppRegistry.registerComponent('reactNative', ()=>App);
编辑完代码之后,我们使用windows command 进入项目的目录,然后使用命令:react-native start启动项目,然后启动模拟器,接着使用命令:react-native run-android。就可以在模拟器中看到如下效果!

这里结合代码,我们可以看出:最外层的View我们使用的是样式style.main,采用的flex:1,borderColor:’blue’ 就是我们图片中最外层的蓝色边框视图。flex值大于0是表示控件是可以伸缩的,由于没有其他视图和这里的最外层View视图竞争空间,因此它填充满了我们这个手机屏幕。然后里面有2个子View视图。
第一个视图使用样式style.view1 它的边框是红色,采用的flexDirection:’column’纵向伸缩,因此它里面的三个Text控件都是从上往下依次排列的。
第二个视图使用样式style.view2 它的边框也是红色,采用的flexDirection:’row’横向伸缩,因此它里面的7个Text控件都是从左向右依次排列的。(最后一个Text超出了手机宽度边界,未显示完整。)
由此我们可以看出:在RN中flexbox的flexDirection有两个字column和row默认为column值。当设置为column时控件按照纵向依次排列布局,当设置为row时控件按照横向依次排列布局;
前面我们说了最外层的View设置flex=1是因为没有其他控件和它竞争空间,因此它填充满了我们整个手机屏幕。这里我们修改一下样式表styles向其中添加几个样式,并将它们应用到View1中的3个Text中,修改代码如下:
var App = React.createClass({
render: function () {
return (
<View style={styles.main}>
<View style={styles.view1}>
<Text style={[styles.text,styles.row1]}>Test1</Text>
<Text style={[styles.text,styles.row2]}>Test2</Text>
<Text style={[styles.text,styles.row3]}>Test3</Text>
</View>
<View style={styles.view2}>
<Text style={styles.text}>Test4</Text>
<Text style={styles.text}>Test5</Text>
<Text style={styles.text}>Test6</Text>
<Text style={styles.text}>Test7</Text>
<Text style={styles.text}>Test8</Text>
<Text style={styles.text}>Test9</Text>
<Text style={styles.text}>Test10</Text>
</View>
</View>
);
}
})
var styles = StyleSheet.create({
main: {
flex: 1, borderColor: 'blue', margin: 5, borderWidth: 1
},
view1: {
borderColor: 'red', borderWidth: 1, flexDirection: 'column', height: 150
},
view2: {
borderColor: 'red', borderWidth: 1, flexDirection: 'row'
},
text: {
fontSize: 14, margin: 10
},
row1: {flex: 3},
row2: {flex: 2},
row3: {flex: 1}
})
这里我们将View1中的三个Text控件的flext值分别设置为3,2,1,然后我们在手机中看的效果如下图:我们可以看出三个Text控件的高度分别为3:2:1占满了我们的View1的高度,这也证实了我们前面的结论。

然后我们看一下alignSelf布局,alignSelf的对齐方式主要有四种:flex-start、 flex-end、 center、 auto、 stretch。我们添加如下代码:
<View style={styles.view3}>
<View style={[styles.left,{width:100,height:40, borderWidth:1,borderColor:'silver'}]}><Text>left</Text></View>
<View style={[styles.center,{width:100,height:40,borderWidth:1,borderColor:'silver'}]}><Text>center</Text></View>
<View style={[styles.right,{width:100,height:40,borderWidth:1,borderColor:'silver'}]}><Text>right</Text></View>
<View style={[styles.default,{width:100, height:40,borderWidth:1,borderColor:'silver'}]}><Text>default</Text></View>
</View>
styles:
view3: {flex: 1, margin: 5, borderColor: 'red', borderWidth: 1},
left: {alignSelf: 'flex-start'},
center: {alignSelf: 'center'},
right: {alignSelf: 'flex-end'},
default: {alignSelf: 'auto'},
可以看到如下的效果:

然后还有alignItems、justifyContent它们分别是水平居中、垂直居中。它们的用法如下,我们添加如下代码:
<View style={[styles.view3,{alignItems:'center',justifyContent:'center'}]}>
<View style={{width:120,height:30, borderWidth:1,borderColor:'silver'}}>
<Text>水平垂直居中</Text>
</View>
</View>
运行之后可以看到如下效果:

以上就是RN的CSS和flexbox布局的简单学习。
React-Native 之控件布局的更多相关文章
- 带着问题写React Native原生控件--Android视频直播控件
最近在做的采用React Native项目有一个需求,视频直播与直播流播放同一个布局中,带着问题去思考如何实现,能更容易找到问题关键点,下面分析这个控件解决方法: 现在条件:视频播放控件(开源的ijk ...
- React Native图片控件的使用
首先定义组件 import { AppRegistry, StyleSheet, Text, View, Image,} from 'react-native'; 然后将render返回中的模版增加I ...
- React Native - 2 控件Flexbox
*强烈建议使用Genymotion模拟器,比AVD速度快,功能强大. 1. flexDirection Flexbox是连续布局,它有主轴(primary axis)和交叉轴(cross axis ...
- CSharpGL(26)在opengl中实现控件布局/渲染文字
CSharpGL(26)在opengl中实现控件布局/渲染文字 效果图 如图所示,可以将文字.坐标轴固定在窗口的一角. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入( ...
- 运用 BoxLayout 进行 Swing 控件布局
摘自http://www.cnblogs.com/fnlingnzb-learner/p/6008572.html 运用 BoxLayout 进行 Swing 控件布局 对于初学 Java Swing ...
- 学习笔记<4>初步控件布局
一.控件布局基本概念 指控制控件在Activity当中的位置.大小.颜色以及其他控件样式属性 二.控件布局两种方法 1.使用布局文件完成控件布局(eclipse可视化拖拽控件实现) 2.在JAVA代码 ...
- 利用wtl的CDialogResize自动调整atl ActiveX控件布局
前言 利用atl 开发activex控件时,如果使用atl复合控件时,acitvex控件上的界面元素不会自动改变大小,如果自己在OnSize中处理每个子控件的布局是一件非常麻烦的事,我们可以借助wtl ...
- QT学习记录之控件布局
作者:朱金灿 来源:http://blog.csdn.net/clever101 想到控件布局就会想到Windows编程中要实现对话框上的控件的合理布局是一件多么艰难的事情.对此QT提出了一个很方便的 ...
- CPF 入门教程 - 控件布局(六)
CPF netcore跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) C ...
随机推荐
- jvm内存模型和内存分配
1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的. (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和 ...
- HDU 1394 Minimum Inversion Number(线段树求逆序对)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1394 解题报告:给出一个序列,求出这个序列的逆序数,然后依次将第一个数移动到最后一位,求在这个过程中 ...
- 原生Android动作
ACTION_ALL_APPS:打开一个列出所有已安装应用程序的Activity.通常,此操作又启动器处理. ACTION_ANSWER:打开一个处理来电的Activity,通常这个动作是由本地电话拨 ...
- openCV的基本操作
http://www.cnblogs.com/luluathena/archive/2010/09/29/1838471.html
- ExecutorService 和 NSOperationQueue
ExecutorService,简化了Android中的并发处理,NSOperationQueue简化了iOS中的并发处理.它们都管理线程池,作用十分相近,下面简单说明一下. 1.ExecutorSe ...
- Cocos2d-JS游戏导演
什么是游戏的导演 具体来说,Cocos2d-JS中的导演是一个对象,它负责设置游戏的运行环境,控制游戏的住循环并且管理场景和场景的切换. 导演的任务 Cocos2d-JS中导演对象名为:cc.dire ...
- 部署django应用
Autor: wangxianlong 2016/7/10 16:17:55 环境: centos 6.5 python 2.7.5 django 1.9 nginx 1.8 selinux diab ...
- 重命名nginx服务器
为了防止被黑客扫描到web服务器信息,通过相对应的web服务器信息找出对应的版本漏洞,从而对web服务器进行入侵,nginx虽然功能强大,但是也是软件,软件就可能会有漏洞,例如nginx-0.6.32 ...
- repo的用法
转自:http://blog.csdn.net/junglyfine/article/details/6299636 注:repo只是google用Python脚本写的调用Git的一个脚本,主要是用来 ...
- hdu 2199:Can you solve this equation?(二分搜索)
Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...