React Native 仿天猫物流跟踪时间轴
最近心血来潮开始学习ReactNative,正好最近有一个项目可能会用到时间轴,页面原型类似于天猫的物流跟踪,如下图

分析之后决定使用ListView来实现,左边的时间轴则使用Art来绘制。
分析左边的时间轴,其实就是每一行都有一条竖线,第一行和最后一行稍微特殊些,第一行需要单独绘制一下,最后一行只显示轴结点上方的线。
为了方便使用,封装成组件,具体实现如下:
import React, { Component } from 'react';
import {
View,
Text,
ListView,
StyleSheet,
ART
} from 'react-native';
const { Surface, Shape, Path } = ART;
export default class TimeAxis extends React.Component {
constructor(props) {
super(props);
this.state = {
rowHeight: 60,
dataSource: new ListView.DataSource({
rowHasChanged: (row1, row2) => row1 !== row2,
}),
};
}
componentDidMount() {
if (this.props.direction) {
this.props.dataSource = this.props.dataSource.reverse();
}
this.setState({
rowHeight: this.props.rowHeight ? this.props.rowHeight : this.state.rowHeight,
dataSource: this.state.dataSource.cloneWithRows(this.props.dataSource ? this.props.dataSource : [])
})
}
_renderRow = (rowData, sectionID, rowID) => {
var item;
if (this.props.row) {
item = this.props.row(rowData, rowID, this.state.dataSource.getRowCount());
} else {
item = <Text>{rowData}</Text>
}
const line = new Path();
const circle = new Path();
let circleColor = "#e1e1e1";
var back;
if (rowID == 0) {
line.moveTo(12, 27).lineTo(12, this.state.rowHeight).close();
circle.moveTo(12, 9)
.arc(0, 14, 7)
.arc(0, -14, 7)
.close();
circleColor = "#59c93b";
back = <ART.Shape style={{ zoom: 999, opacity: 0.1 }} d={new Path()
.moveTo(12, 6)
.arc(0, 20, 10)
.arc(0, -20, 10)
.close()} fill="#d3e2cf"></ART.Shape>
}
else {
let y = this.state.rowHeight;
if (rowID == this.state.dataSource.getRowCount() - 1) {
y = this.state.rowHeight * 0.25;
}
line.moveTo(12, 0)
.lineTo(12, y).close();
circle.moveTo(12, this.state.rowHeight * 0.25)
.arc(0, 10, 5)
.arc(0, -10, 5)
.close();
}
var itemStyles = this.props.itemStyle ? [styles.item_content, this.props.itemStyle] : styles.item_content;
return (
<View style={[styles.item, { height: this.state.rowHeight }]}>
<View style={[styles.item_line]}>
<ART.Surface width={24} height={this.state.rowHeight}>
{back}
<ART.Shape d={circle} fill={circleColor} stroke="#e1e1e1" strokeWidth={1}></ART.Shape>
<ART.Shape d={line} stroke="#e1e1e1" strokeWidth={1}></ART.Shape>
</ART.Surface>
</View>
<View style={itemStyles}>{item}</View>
</View >
);
}
render() {
return (
<ListView
style={{ marginTop: 5, backgroundColor: '#fff' }}
dataSource={this.state.dataSource}
renderRow={this._renderRow.bind(this)}
renderFooter={this.renderFooter}
/>
);
}
}
const styles = StyleSheet.create({
item: {
marginTop: 1,
backgroundColor: '#fff',
flexDirection: 'row'
},
item_line: {
flex: 2,
paddingLeft: 5,
},
item_content: {
flex: 13,
borderBottomWidth: 1,
borderColor: '#b0b0b0'
}
});
使用就简单了,设置好dataSource
var source = [
{ Text: "包裹等待揽收", Time: "2017-06-02 11:49:00" },
{ Text: "[北京市]XX快递 北京XX中心收件员XX已揽件", Time: "2017-06-02 15:49:05" },
{ Text: "[北京市]北京XX中心已发出", Time: "2017-06-02 16:20:11" },
{ Text: "[北京市]快件已到达XX站点", Time: "2017-06-02 20:15:04" },
{ Text: "[北京市]XX站点员:XXX正在派件", Time: "2017-06-03 07:35:18" },
{ Text: "[北京市]已完成", Time: "2017-06-03 08:21:48" }
];
设置行高(默认60),设置好每行的显示格式,就可以了。
<TimeAxis
itemStyle={{}}
rowHeight={60}
dataSource={source}
row={(rowData, i, count) => {
var fontColor = '#757575';
if (i == 0) {
fontColor = 'green';
}
return (
<View style={{ height: '100%', padding: 5 }}>
<Text style={{ color: fontColor, flex: 1 }}>{rowData.Text}</Text>
<Text style={{ color: fontColor, alignItems: 'flex-end' }}>{rowData.Time}</Text>
</View>
);
}}
/>
最张效果如图:

React Native 仿天猫物流跟踪时间轴的更多相关文章
- [RN] React Native 仿美团下拉筛选菜单控件
React Native 仿美团下拉筛选菜单控件 演示效果如下: 使用方法如下: 1.安装 npm install react-native-dropdownmenus --save react-na ...
- React Native仿京东客户端实现(首页 分类 发现 购物车 我的)五个Tab导航页面
1.首先创建 这几个文件 myths-Mac:JdApp myth$ yarn add react-native-tab-navigator 2.各个文件完整代码 1)CartPage.js imp ...
- 带你从零学ReactNative开发跨平台App开发-[react native 仿boss直聘](十三)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- react native仿微信性别选择-自定义弹出框
简述 要实现微信性别选择需要使用两部分的技术: 第一.是自定义弹出框: 第二.单选框控件使用: 效果 实现 一.配置弹出框 弹出框用的是:react-native-popup-dialog(Git地址 ...
- React Native专题-江清清
本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶相关讲解. 刚创建的React Native交流8群:533435865 欢迎各位大牛, ...
- React Native 常用插件案例
(二).基础入门: 1.React Native For Android环境配置以及第一个实例 2.React Native开发IDE安装及配置 3.React Native应用设备运行(Runnin ...
- React Native专题
转载注明出处:地址:http://www.lcode.org本文出自:[江清清的技术专栏]本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶 ...
- React Native 二维码扫描组件
学rn得朋友们,你们知道rn开源项目吗?来吧看这里:http://www.marno.cn/(rn开源项目) React Native学习之路(9) - 注册登录验证的实现 + (用Fetch实现po ...
- react-native —— 在Windows下搭建React Native Android开发环境
在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...
随机推荐
- java web 简单的登录注册
--sql文件 create database studentgouse studentgocreate table stuinfo(--stuid int primary key identity( ...
- 使用gnuplot对tpcc-mysql压测结果生成图表
tpcc-mysql的安装:http://www.cnblogs.com/lizhi221/p/6814003.html tpcc-mysql的使用:http://www.cnblogs.com/li ...
- R语言分析(一)-----基本语法
一, R语言所处理的工作层: 解释一下: 最下面的一层为数据源,往上是数据仓库层,往上是数据探索层,包括统计分析,统计查询,还有就是报告 再往上的三层,分别是数据挖掘,数据展现和数据决策. 由上图 ...
- 初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)
初次安装git配置用户名和邮箱 初次安装git需要配置用户名和邮箱,否则git会提示:please tell me who you are. 你需要运行命令来配置你的用户名和邮箱: $ git con ...
- 学习笔记:javascript内置对象:字符串对象
1.字符串的创建 var str = "Hello Microsoft!"; 2.字符串属性 constructor 返回创建字符串属性的函数 length ...
- 【19道XSS题目】不服来战!
记得第一次接触xss这个概念是在高中,那个时候和一个好基友通过黑客X档案和黑客手册.第一次接触到了除了游戏以外的电脑知识,然后知道了,原来电脑除了玩游戏还可以搞这些,从此两人一发不可收拾的爱上了玩黑这 ...
- Springboot(一):入门篇
什么是spring boot spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...
- Android ec环境配置
ec环境配置 1.0概述 鉴于很多同事,或者新从事android开发,虽然会做android的开发,但是会遇见一些最基本的环境搭建问题,本文仅作为(win7 64位系统)eclipse中集成andro ...
- angular.js实现省市区三级联动指令
不多说,直接上代码,一开始搞了好久,最后才弄懂,希望对大家有帮助 1.jade div.col-md-2 select.form-control(ng-options="value.code ...
- xargs命令详解
xargs命令是把接收到的数据重新格式化,再将其作为参数提供给其他命令,下面介绍xargs命令的各种使用技巧 一.将多行输入转换成单行输入: [root@host1 test]# echo -e &q ...