1、时间轴效果

我们要实现的时间轴效果如下图所示,这是锤子手机的查看物流信息界面的截图。

2、主要布局的实现

TraceActivity关联的布局文件activity_trace.xml中放置一个ListView,代码如下。由于这个列表只是用于展示信息,并不需要用户去点击,所以将其clickable属性置为false;为了消除ListView点击产生的波纹效果,我们设置其listSelector属性的值为透明;我们不需要列表项之间的分割线,所以设置其divider属性的值为null

  • activity_trace.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@android:color/white"tools:context="cc.duduhuo.timelinedemo.TraceActivity"><ListView
        android:id="@+id/lvTrace"android:layout_width="match_parent"android:divider="@null"android:clickable="false"android:listSelector="@android:color/transparent"android:dividerHeight="0dp"android:layout_height="wrap_content" />
</LinearLayout>

之后再设计每个列表项的布局item_trace.xml,代码如下。由于时间轴的点和线都位于item布局中,为了使线是连续的,所以设置上面ListViewdividerHeight属性值为0dp,即垂直方向每个列表项都是紧挨着的。在item的布局中,我们先使用LinearLayout将布局分成左右两个部分,左边就是时间轴的布局,右边是物流信息的布局。

先说物流信息的布局,物流信息是一个RelativeLayout,其内放置两个TextView分别用于承载物流信息的时间的描述的显示,为了不使两个列表项的文本靠得太近,我们在RelativeLayout中设置其paddingBottompaddingTop属性。

再说时间轴的布局,时间轴的布局也是一个RelativeLayout,但是不设置其padding属性,宽度为32dp。为了使时间轴的圆点和显示时间的文本对齐,我们需要在圆点之上再放置一条竖线,所以整体的布局就是 线 - 点 - 线。为了让线可以正好对准圆点的中心,我们让线和点都水平居中,即android:layout_centerHorizontal="true"

  • item_trace.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="horizontal"><RelativeLayout
        android:id="@+id/rlTimeline"android:layout_width="32dp"android:layout_height="match_parent"><TextView
            android:id="@+id/tvTopLine"android:layout_width="0.5dp"android:layout_height="12dp"android:layout_centerHorizontal="true"android:background="#999" /><TextView
            android:id="@+id/tvDot"android:layout_width="5dp"android:layout_height="5dp"android:layout_below="@id/tvTopLine"android:layout_centerHorizontal="true"android:background="@drawable/timelline_dot_normal" /><TextView
            android:layout_width="0.5dp"android:layout_height="match_parent"android:layout_below="@id/tvDot"android:layout_centerHorizontal="true"android:background="#999" /></RelativeLayout><RelativeLayout
        android:id="@+id/rlCenter"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="6dp"android:paddingRight="10dp"android:paddingTop="6dp"><TextView
            android:id="@+id/tvAcceptTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="2014/06/24 20:55:28"android:textColor="#999"android:textSize="12sp" /><TextView
            android:id="@+id/tvAcceptStation"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/tvAcceptTime"android:layout_marginTop="5dp"android:text="快件在 深圳 ,准备送往下一站 深圳集散中心 [深圳市]"android:textColor="#999"android:textSize="12sp" /></RelativeLayout>
</LinearLayout>

圆点的背景资源如下代码:

  • timelline_dot_first.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><size
        android:width="10dp"android:height="10dp" /><solid android:color="#555555" />
</shape>
  • timelline_dot_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><size
        android:width="10dp"android:height="10dp" /><solid android:color="#999999" />
</shape>

3、Activity

为了可以看到布局的效果,我们在TraceActivity中模拟一些假数据。需要定义一个实体类Trace,它有两个属性,acceptTimeacceptStation,代码如下:

  • Trace.java
public class Trace {/** 时间 */private String acceptTime;/** 描述 */private String acceptStation;public Trace() {}public Trace(String acceptTime, String acceptStation) {this.acceptTime = acceptTime;this.acceptStation = acceptStation;}public String getAcceptTime() {return acceptTime;}public void setAcceptTime(String acceptTime) {this.acceptTime = acceptTime;}public String getAcceptStation() {return acceptStation;}public void setAcceptStation(String acceptStation) {this.acceptStation = acceptStation;}
}
  • TraceActivity.java
public class TraceActivity extends AppCompatActivity {private ListView lvTrace;private List<Trace> traceList = new ArrayList<>(10);private TraceListAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_trace);findView();initData();}private void findView() {lvTrace = (ListView) findViewById(R.id.lvTrace);}private void initData() {// 模拟一些假的数据traceList.add(new Trace("2016-05-25 17:48:00", "[沈阳市] [沈阳和平五部]的派件已签收 感谢使用中通快递,期待再次为您服务!"));traceList.add(new Trace("2016-05-25 14:13:00", "[沈阳市] [沈阳和平五部]的东北大学代理点正在派件 电话:18040xxxxxx 请保持电话畅通、耐心等待"));traceList.add(new Trace("2016-05-25 13:01:04", "[沈阳市] 快件到达 [沈阳和平五部]"));traceList.add(new Trace("2016-05-25 12:19:47", "[沈阳市] 快件离开 [沈阳中转]已发往[沈阳和平五部]"));traceList.add(new Trace("2016-05-25 11:12:44", "[沈阳市] 快件到达 [沈阳中转]"));traceList.add(new Trace("2016-05-24 03:12:12", "[嘉兴市] 快件离开 [杭州中转部]已发往[沈阳中转]"));traceList.add(new Trace("2016-05-23 21:06:46", "[杭州市] 快件到达 [杭州汽运部]"));traceList.add(new Trace("2016-05-23 18:59:41", "[杭州市] 快件离开 [杭州乔司区]已发往[沈阳]"));traceList.add(new Trace("2016-05-23 18:35:32", "[杭州市] [杭州乔司区]的市场部已收件 电话:18358xxxxxx"));adapter = new TraceListAdapter(this, traceList);lvTrace.setAdapter(adapter);}
}

4、Adapter

需要为ListView设置一个Adapter。定义一个TraceListAdapter,代码如下。由于第一行的物流信息的显示形式和其他的不一样,所以把item分成两个类型,TYPE_TOP 指第一行的item,TYPE_NORMAL指其他的item。区别在于,第一行的item的时间轴布局中最上面的线不显示,而且文字颜色和圆点的颜色较深。其余item文字颜色和圆点颜色稍浅一些,而且线 - 点 - 线也全都显示。

  • TraceListAdapter.java
public class TraceListAdapter extends BaseAdapter {private Context context;private List<Trace> traceList = new ArrayList<>(1);private static final int TYPE_TOP = 0x0000;private static final int TYPE_NORMAL= 0x0001;public TraceListAdapter(Context context, List<Trace> traceList) {this.context = context;this.traceList = traceList;}@Overridepublic int getCount() {return traceList.size();}@Overridepublic Trace getItem(int position) {return traceList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;final Trace trace = getItem(position);if (convertView != null) {holder = (ViewHolder) convertView.getTag();} else {holder = new ViewHolder();convertView = LayoutInflater.from(context).inflate(R.layout.item_trace, parent, false);holder.tvAcceptTime = (TextView) convertView.findViewById(R.id.tvAcceptTime);holder.tvAcceptStation = (TextView) convertView.findViewById(R.id.tvAcceptStation);holder.tvTopLine = (TextView) convertView.findViewById(R.id.tvTopLine);holder.tvDot = (TextView) convertView.findViewById(R.id.tvDot);convertView.setTag(holder);}if (getItemViewType(position) == TYPE_TOP) {// 第一行头的竖线不显示holder.tvTopLine.setVisibility(View.INVISIBLE);// 字体颜色加深holder.tvAcceptTime.setTextColor(0xff555555);holder.tvAcceptStation.setTextColor(0xff555555);holder.tvDot.setBackgroundResource(R.drawable.timelline_dot_first);} else if (getItemViewType(position) == TYPE_NORMAL) {holder.tvTopLine.setVisibility(View.VISIBLE);holder.tvAcceptTime.setTextColor(0xff999999);holder.tvAcceptStation.setTextColor(0xff999999);holder.tvDot.setBackgroundResource(R.drawable.timelline_dot_normal);}holder.tvAcceptTime.setText(trace.getAcceptTime());holder.tvAcceptStation.setText(trace.getAcceptStation());return convertView;}@Overridepublic int getItemViewType(int id) {if (id == 0) {return TYPE_TOP;}return TYPE_NORMAL;}static class ViewHolder {public TextView tvAcceptTime, tvAcceptStation;public TextView tvTopLine, tvDot;}
}

5、效果展示

6、代码下载

Demo代码下载

Android时间轴(Timeline)效果的实现相关推荐

  1. Android 时间轴

    效果图: 数据是随便填的,显得有点乱,但是不影响效果.实现方面主要是用ListView来实现,主要是根据ListView的item位置与上一条数据进行比较,来控制时间的显示隐藏效果.思路很简单,下面看 ...

  2. android时间轴折线图,echarts时间轴折线图

    当使用echarts折线图时,每个数据会打点,在数据量小的时候,美观又快捷,但是当数据量过大时,会非常的卡,以及不美观 例如: series: { symbol:'circle', } > EC ...

  3. Android 时间轴的实现

    时间轴 时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户带来一种更加直观的体验.京东和淘宝的物流顺序就是一个时间轴(如图),想必大家都不陌生. 时间轴的初探 初次见到这种UI,感觉整个布局 ...

  4. Qt 实现的时间轴 Timeline 用于视频非线形编辑工具

    基于Qt 图形/视图实现的时间轴编辑器,支持缩放,时间/帧 现实方式,clip的放大缩小. 配合视频播放窗口效果应该不错,放几张预览图给感兴趣的人参考下,另外,提供源码下载,不收费. 1)使用鼠标进行 ...

  5. android如何动态显示时间轴,Android时间轴的实现

    做项目的过程中呢,有个需求,要做出一个跟时间轴差不多的效果的页面,于是找了部分资料,基本上都是用ExpandableListView来实现这一效果的,于是开始着手了,我也要开始写我的项目了,先写个De ...

  6. android时间轴折线图,带时间轴的折线图

    8.20折线图数据 click document.getElementById('btn').οnclick=function() { // 基于准备好的dom,初始化echarts实例 var my ...

  7. android时间轴左右交叉布局,快速简单的定制一个时间轴布局(LinearLayout)

    github: 先上图: 很多情况下,我们都会遇到需要类似于时间轴的一个布局,网上也有很多,但是很多情况下我们其实并不需要那么多库,毕竟64k限制就在那,不管我们用还是不用,它依然在那... 而且更多 ...

  8. 工具说明书 - 如何画时间轴(Timeline)

    第一种方法,使用Office里的Excel.PowerPoint.Word工具. Create a timeline Insert -> SmartArt -> Process, 选择Ci ...

  9. Flutter 物流状态、时间轴页面效果实现,IntrinsicHeight控件;

    效果如上图: 布局分为左右两部分,左边的线和点 , 右边的物流文本信息: 左控件的高度根据右控件的高度而定,右边的高度不是固定的,是Text文本信息的高度:这个时候就要引出IntrinsicHeigh ...

最新文章

  1. Android开发实战三之导入现有Android工程项目
  2. HTTP与HTTPS对访问速度(性能)的影响
  3. ztree树形菜单demo
  4. 关闭用playsound函数的WAV文件
  5. PHP 根据referer 跳转,PHP利用REFERER根居访问来地址进行页面跳转
  6. WPS Office 2019 发布Linux 个人版
  7. 100大产业链全景图(2020版)及智能制造50大产业链
  8. 视频文件转gif图片Movie To GIF使用
  9. 树莓派(RPi) CentOS7扩展内存卡剩余空间
  10. 江苏省2008年普通高校自主招生入选考生名单公示 - 北大清华版
  11. 怎么看小米的去扁平化
  12. 流落在帝都的那些80后北漂IT人,你们的未来在哪儿
  13. 教你设置让电脑每天在指定时间自动关机
  14. Android Studio制作.9图片,看这一篇就够了
  15. php 绘制斜线,css怎么绘制斜线
  16. 全国青少年编程等级考试python一级真题2020年12月(含题库答题软件账号)
  17. cad相贯展开图lisp_cad相贯线的画法
  18. C++学习笔记(C转)
  19. 腾讯重磅开源 DCache,分布式 NoSQL 存储系统
  20. 计算机等级一级考试上机试题,计算机等级考试一级上机试题

热门文章

  1. 苹果手机ios系统通过数据线连接电脑进行抓包,不在同一局域网下的解决方案
  2. rssi java_关于RSSI的问题
  3. python自动化办公案例-python自动化办公:文件篇(自动整理文件,一键完成)
  4. 关于棋牌游戏的福建十三水的一个工具类(牌型分析、大小对比、自动摆牌、获取所有牌型组合)
  5. 产品开发管理方法论之 IPD ——读《新产品开发管理,就用IPD》
  6. LeetCode297:hard级别中最简单的存在,java版,用时击败98%,内存击败百分之九十九
  7. iOS8键盘不弹出(Can't find keyplane that supports type 4 for keyboard iPhone-Portrait-NumberPad)
  8. Apple开发者账号介绍及证书配置详细说明
  9. 超火玩法云蹦迪-挤地铁-冲马桶—获取地址
  10. 暴雪正在物色接盘侠/ iOS16.2正式版发布/ 马斯克拍卖推特产品…今日更多新鲜事在此...