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

分析之后决定使用ListView来实现,左边的时间轴则使用Art来绘制。

分析左边的时间轴,其实就是每一行都有一条竖线,第一行和最后一行稍微特殊些,第一行需要单独绘制一下,最后一行只显示轴结点上方的线。

为了方便使用,封装成组件,具体实现如下:

  1. import React, { Component } from 'react';
  2. import {
  3. View,
  4. Text,
  5. ListView,
  6. StyleSheet,
  7. ART
  8. } from 'react-native';
  9.  
  10. const { Surface, Shape, Path } = ART;
  11.  
  12. export default class TimeAxis extends React.Component {
  13.  
  14. constructor(props) {
  15. super(props);
  16. this.state = {
  17. rowHeight: 60,
  18. dataSource: new ListView.DataSource({
  19. rowHasChanged: (row1, row2) => row1 !== row2,
  20. }),
  21. };
  22. }
  23.  
  24. componentDidMount() {
  25. if (this.props.direction) {
  26. this.props.dataSource = this.props.dataSource.reverse();
  27. }
  28. this.setState({
  29. rowHeight: this.props.rowHeight ? this.props.rowHeight : this.state.rowHeight,
  30. dataSource: this.state.dataSource.cloneWithRows(this.props.dataSource ? this.props.dataSource : [])
  31. })
  32. }
  33.  
  34. _renderRow = (rowData, sectionID, rowID) => {
  35. var item;
  36. if (this.props.row) {
  37. item = this.props.row(rowData, rowID, this.state.dataSource.getRowCount());
  38. } else {
  39. item = <Text>{rowData}</Text>
  40. }
  41. const line = new Path();
  42. const circle = new Path();
  43.  
  44. let circleColor = "#e1e1e1";
  45. var back;
  46. if (rowID == 0) {
  47. line.moveTo(12, 27).lineTo(12, this.state.rowHeight).close();
  48.  
  49. circle.moveTo(12, 9)
  50. .arc(0, 14, 7)
  51. .arc(0, -14, 7)
  52. .close();
  53. circleColor = "#59c93b";
  54.  
  55. back = <ART.Shape style={{ zoom: 999, opacity: 0.1 }} d={new Path()
  56. .moveTo(12, 6)
  57. .arc(0, 20, 10)
  58. .arc(0, -20, 10)
  59. .close()} fill="#d3e2cf"></ART.Shape>
  60. }
  61. else {
  62. let y = this.state.rowHeight;
  63. if (rowID == this.state.dataSource.getRowCount() - 1) {
  64. y = this.state.rowHeight * 0.25;
  65. }
  66. line.moveTo(12, 0)
  67. .lineTo(12, y).close();
  68.  
  69. circle.moveTo(12, this.state.rowHeight * 0.25)
  70. .arc(0, 10, 5)
  71. .arc(0, -10, 5)
  72. .close();
  73. }
  74.  
  75. var itemStyles = this.props.itemStyle ? [styles.item_content, this.props.itemStyle] : styles.item_content;
  76.  
  77. return (
  78. <View style={[styles.item, { height: this.state.rowHeight }]}>
  79. <View style={[styles.item_line]}>
  80. <ART.Surface width={24} height={this.state.rowHeight}>
  81. {back}
  82. <ART.Shape d={circle} fill={circleColor} stroke="#e1e1e1" strokeWidth={1}></ART.Shape>
  83. <ART.Shape d={line} stroke="#e1e1e1" strokeWidth={1}></ART.Shape>
  84. </ART.Surface>
  85. </View>
  86. <View style={itemStyles}>{item}</View>
  87. </View >
  88. );
  89. }
  90.  
  91. render() {
  92. return (
  93. <ListView
  94. style={{ marginTop: 5, backgroundColor: '#fff' }}
  95. dataSource={this.state.dataSource}
  96. renderRow={this._renderRow.bind(this)}
  97. renderFooter={this.renderFooter}
  98. />
  99. );
  100. }
  101. }
  102. const styles = StyleSheet.create({
  103. item: {
  104. marginTop: 1,
  105. backgroundColor: '#fff',
  106. flexDirection: 'row'
  107. },
  108. item_line: {
  109. flex: 2,
  110. paddingLeft: 5,
  111.  
  112. },
  113. item_content: {
  114. flex: 13,
  115. borderBottomWidth: 1,
  116. borderColor: '#b0b0b0'
  117. }
  118. });

使用就简单了,设置好dataSource

  1. var source = [
  2. { Text: "包裹等待揽收", Time: "2017-06-02 11:49:00" },
  3. { Text: "[北京市]XX快递 北京XX中心收件员XX已揽件", Time: "2017-06-02 15:49:05" },
  4. { Text: "[北京市]北京XX中心已发出", Time: "2017-06-02 16:20:11" },
  5. { Text: "[北京市]快件已到达XX站点", Time: "2017-06-02 20:15:04" },
  6. { Text: "[北京市]XX站点员:XXX正在派件", Time: "2017-06-03 07:35:18" },
  7. { Text: "[北京市]已完成", Time: "2017-06-03 08:21:48" }
  8. ];

设置行高(默认60),设置好每行的显示格式,就可以了。

  1. <TimeAxis
  2. itemStyle={{}}
  3. rowHeight={60}
  4. dataSource={source}
  5. row={(rowData, i, count) => {
  6. var fontColor = '#757575';
  7. if (i == 0) {
  8. fontColor = 'green';
  9. }
  10. return (
  11. <View style={{ height: '100%', padding: 5 }}>
  12. <Text style={{ color: fontColor, flex: 1 }}>{rowData.Text}</Text>
  13. <Text style={{ color: fontColor, alignItems: 'flex-end' }}>{rowData.Time}</Text>
  14. </View>
  15. );
  16. }}
  17. />

最张效果如图:

React Native 仿天猫物流跟踪时间轴的更多相关文章

  1. [RN] React Native 仿美团下拉筛选菜单控件

    React Native 仿美团下拉筛选菜单控件 演示效果如下: 使用方法如下: 1.安装 npm install react-native-dropdownmenus --save react-na ...

  2. React Native仿京东客户端实现(首页 分类 发现 购物车 我的)五个Tab导航页面

    1.首先创建  这几个文件 myths-Mac:JdApp myth$ yarn add react-native-tab-navigator 2.各个文件完整代码 1)CartPage.js imp ...

  3. 带你从零学ReactNative开发跨平台App开发-[react native 仿boss直聘](十三)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  4. react native仿微信性别选择-自定义弹出框

    简述 要实现微信性别选择需要使用两部分的技术: 第一.是自定义弹出框: 第二.单选框控件使用: 效果 实现 一.配置弹出框 弹出框用的是:react-native-popup-dialog(Git地址 ...

  5. React Native专题-江清清

    本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶相关讲解. 刚创建的React Native交流8群:533435865  欢迎各位大牛, ...

  6. React Native 常用插件案例

    (二).基础入门: 1.React Native For Android环境配置以及第一个实例 2.React Native开发IDE安装及配置 3.React Native应用设备运行(Runnin ...

  7. React Native专题

    转载注明出处:地址:http://www.lcode.org本文出自:[江清清的技术专栏]本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶 ...

  8. React Native 二维码扫描组件

    学rn得朋友们,你们知道rn开源项目吗?来吧看这里:http://www.marno.cn/(rn开源项目) React Native学习之路(9) - 注册登录验证的实现 + (用Fetch实现po ...

  9. react-native —— 在Windows下搭建React Native Android开发环境

    在Windows下搭建React Native Android开发环境 前段时间在开发者头条收藏了 @天地之灵_邓鋆 分享的<在Windows下搭建React Native Android开发环 ...

随机推荐

  1. Android计时器 android.widget.Chronometer

    说起做定时器,大家一般会想到Timer和Executors的定时器线程池,其实用这两个做都会有问题,在停止和重新计时时你回发现无法停止或者说计时加快(加快是因为多个线程在记录同一个变量),Androi ...

  2. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十四)谈谈写博客的原因和项目优化

    阶段总结 又到了优化篇的收尾阶段了,这其实是一篇阶段总结性的文章,今天是4月29号,距离第一次发布博客已经两个月零5天,这两个多月的时间,完成了第一个项目ssm-demo的更新,过程中也写了33篇博客 ...

  3. java文件的读写操作

    java文件的读写操作主要是对输入流和输出流的操作,由于流的分类很多,所以概念很容易模糊,基于此,对于流的读写操作做一个小结. 1.根据数据的流向来分: 输出流:是用来写数据的,是由程序(内存)--- ...

  4. 搭建后台页面布局利用属性target 属性

    HTML 5 <form> target 属性 HTML 5 <form> 标签 实例 提交一个在新窗口中打开的表单: <form action="demo_f ...

  5. ShadowBroker释放的NSA工具中Esteemaudit漏洞复现过程

    没有时间测试呢,朋友们都成功复现,放上网盘地址:https://github.com/x0rz/EQGRP 近日臭名昭著的方程式组织工具包再次被公开,TheShadowBrokers在steemit. ...

  6. Linux Centos 6.5_x86安装Nginx

    一.下载 二.编译安装 三.启动.停止.平滑重启 一.下载 地址:http://nginx.org/en/download.html 或者在linux上使用wget命令下载: wget http:// ...

  7. Zookeeper ZAB 协议分析

    前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议.在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeep ...

  8. 基于本地文件系统的LocalDB

    零.前言 之前写一些小工具的时候,需要用到数据存储方面的技术,但是用数据库又觉得太大了,本地文件存储txt文件存储又不是很规范,于是乎想到了去编写一个简单的基于本地文件系统的数据存储库,暂且叫它loc ...

  9. 在 iOS 10.0 之后, App 要调用手机相机与相簿应注意的事项

    iOS 的 SDK 每一年至少都会有一次大改版,从 2009 到 2016 年,版号已经到了第 10 版了,很轻易的就追上了 Mac OSX. 每一次的大改版都会有不少新的功能或新的规范,在 iOS ...

  10. hdu 1711---KMP

    题目链接 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...