• 时光轴一之listView实现时光轴效果


       尼玛。非要搞什么时光轴,一想简单的不就是个listView吗,然后一步一步来就好了,哈哈别看那么好看事实上不要想多了。

     时光轴timeline最大的作用就是把过去的事物系统化、完整化、精确化。时间轴可以让用户更直观的看到,我的这一刻在做什么。那一刻做过什么,根据时间顺序。把一方面或多方面的时间足迹事件串联起来,形成相对完整的记录体系,再运用图文的形式呈现给用户;页面简单。表现形式特别,一直以来受到广大用户的欢迎。

    qq空间的时光轴还是用起来蛮不错的,看图:


    要实现我们就慢慢来吧。尽管效果赶不上qq空间可是个人认为还是不错的,以下我们看listView方法的实现:

    先main_activity.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:orientation="vertical" >
        <ListView
            android:id="@+id/lv_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:cacheColorHint="@null"
            android:divider="@null" >
        </ListView>
    </LinearLayout>

    主布局非常easy。就是一个listView,设置切割线为空就好了,然后cacheColorHint也为空。

    接下来我们写时光轴的item布局:

    item_time_line.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
        <RelativeLayout
            android:id="@+id/rl_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingTop="10dp" >
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="8dp"
                android:background="@drawable/img_line_point" />
            <TextView
                android:id="@+id/txt_date_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="15dp"
                android:textColor="#FC6802" />
        </RelativeLayout>
        <View
            android:id="@+id/v_line"
            android:layout_width="2dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:background="#FC6802" />
        <ImageView
            android:padding="8dp"
            android:id="@+id/img"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_below="@id/rl_title"
            android:layout_marginLeft="3dp"
            android:layout_toRightOf="@id/v_line"
            android:scaleType="fitXY" />
        <TextView
            android:paddingTop="15dp"
            android:id="@+id/txt_date_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/rl_title"
            android:layout_marginLeft="15dp"
            android:layout_toRightOf="@id/img"
            android:paddingBottom="10dp"
            android:maxLines="3"
            android:textColor="#5296C5" />
    </RelativeLayout>

    我们的时光轴呢。由标题、时光轴的线、图片、时间点图片和文字内容组成,然后时光轴的线我们是动态显示的,为了方便显示,我把图片大小固定为80x80,然后文字强制设为最大行数为3行。效果还是比較明显 的。

    接下来上代码:

    先来一下数据实体:

    DateText.java

    package com.zy.timeline;
    public class DateText {
    private String date;
    private String text;
            private int imgsrc;
    public DateText(String date, String text,int imgsrc) {
    super();
    this.date = date;
    this.text = text;
    this.imgsrc=imgsrc;
    }
    public String getDate() {
    return date;
    }
    public void setDate(String date) {
    this.date = date;
    }
    public String getText() {
    return text;
    }
           public void setText(String text) {
    this.text = text;
    }
    public int getImgsrc() {
    return imgsrc;
    }
    public void setImgsrc(int imgsrc) {
    this.imgsrc = imgsrc;
    }
    }

    非常easy的3个成员,各自是时间。文本内容,和图片。

    接着数据适配器:

    DateAdapter.java

    package com.zy.timeline;
    import java.util.List;
    import com.zy.timeline.R;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    import android.widget.RelativeLayout.LayoutParams;
    import android.widget.TextView;
    public class DateAdapter extends BaseAdapter {
    private Context context;
    private List<DateText> list;
    public DateAdapter(Context context, List<DateText> list) {
    this.context = context;
    this.list = list;
    }
    @Override
    public int getCount() {
    if (list == null) {
    return 0;
    }
    return list.size();
    }
    @Override
    public Object getItem(int position) {
    if (list == null) {
    return null;
    }
    return list.get(position);
    }
    @Override
    public long getItemId(int position) {
    return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
    holder = new ViewHolder();
    convertView = LayoutInflater.from(context).inflate(
    R.layout.item_time_line, parent, false);
    holder.date = (TextView) convertView
    .findViewById(R.id.txt_date_time);
    holder.content = (TextView) convertView
    .findViewById(R.id.txt_date_content);
    holder.line = (View) convertView.findViewById(R.id.v_line);
    holder.title = (RelativeLayout) convertView
    .findViewById(R.id.rl_title);
    holder.img = (ImageView) convertView
    .findViewById(R.id.img);
    convertView.setTag(holder);
    } else {
    holder = (ViewHolder) convertView.getTag();
    }
    //时间轴竖线的layout
    LayoutParams params = (LayoutParams) holder.line.getLayoutParams();
    //第一条数据,肯定显示时间标题
    if (position == 0) {
    holder.title.setVisibility(View.VISIBLE);
    holder.date.setText(TimeFormat.format("yyyy.MM.dd",
    list.get(position).getDate()));
    params.addRule(RelativeLayout.ALIGN_TOP, R.id.rl_title);

    params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.img);
    } else { // 不是第一条数据
    // 本条数据和上一条数据的时间戳同样,时间标题不显示
    if (list.get(position).getDate()
    .equals(list.get(position - 1).getDate())) {
    holder.title.setVisibility(View.GONE);
    params.addRule(RelativeLayout.ALIGN_TOP, R.id.txt_date_content);
    params.addRule(RelativeLayout.ALIGN_BOTTOM,
    R.id.img);
    } else {
    //本条数据和上一条的数据的时间戳不同的时候,显示数据
    holder.title.setVisibility(View.VISIBLE);
    holder.date.setText(TimeFormat.format("yyyy.MM.dd",
    list.get(position).getDate()));
    params.addRule(RelativeLayout.ALIGN_TOP, R.id.rl_title);
    params.addRule(RelativeLayout.ALIGN_BOTTOM,
    R.id.img);
    }
    }
    holder.line.setLayoutParams(params);
    holder.content.setText(list.get(position).getText());
    holder.img.setImageResource(list.get(position).getImgsrc());
    return convertView;
    }
    public static class ViewHolder {
    RelativeLayout title;
    View line;
    TextView date;
    TextView content;
    ImageView img;
    }
    }

         数据适配器和普通的数据适配器没有什么两样,仅仅只是是左边的时光轴的线的长度是自己主动匹配的。我这里是图片的高度要高于文字的高度,所以是以图片的底部为标准来设置高度的。

    接下来就是写mainActivity的代码了;

    package com.zy.timeline;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import com.zy.timeline.R;
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView;
    public class MainActivity extends Activity {
    // 时间轴列表
    private ListView lvList;
    // 数据list
    private List<DateText> list;
    // 列表适配器
    private DateAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // findviewbyid
    lvList = (ListView) findViewById(R.id.lv_list);
    list = new ArrayList<DateText>();
    // 加入測试数据
    addData();
    // 将数据依照时间排序
    DateComparator comparator = new DateComparator();
    Collections.sort(list, comparator);
    // listview绑定适配器
    adapter = new DateAdapter(this, list);
    lvList.setAdapter(adapter);
    }
    private void addData() {
    DateText date1 = new DateText("20140710", "人生的平衡。内涵也非常多。

    丰富的内涵。是生存的保障,是身心的健康,是自由和快乐生活的均衡全面的发展。真理往往在俗人觉得的相反之处。常人好争,“圣人不敢为也”,随和谦让。常人追求美好的东西、好吃的东西吃过多了。以后就再也不能吃了。真理讲的是心。不能离心找身外的原因。",R.drawable.one);
    DateText date2 = new DateText("20120209", "夺走你初吻的人如今和你是什么关系",R.drawable.two);
    DateText date3 = new DateText("20140526", "无论有多么的舍不得,我们都仅仅有笑过之后,长歌当哭。",R.drawable.three);
    DateText date4 = new DateText("20150310", "那些让我们哭过的事,总有一天我们会笑着说出来。",R.drawable.one);
    DateText date5 = new DateText("20140911", "你年轻时也曾扬言。要饮遍全世界的酒。老了却发现,白水才是最长情的。",R.drawable.one);
    DateText date6 = new DateText("20140713", "我这一个不太宽厚的肩膀仅仅希望你累了能停靠不太温暖却能为你挡住风浪",R.drawable.one);
    DateText date7 = new DateText("20141012", "有人问过井上,“为什么不设计湘北最后夺冠?”-井上回答说“由于青春的梦想往往是不完美的…",R.drawable.one);
    DateText date8 = new DateText("20140714", "将来的你,一定会感激如今拼命的自己。",R.drawable.one);
    DateText date9 = new DateText("20140709", "地球之所以是圆的,是由于上帝想让那些走失或迷路的人又一次相遇",R.drawable.one);
    DateText date10 = new DateText("20110705", "假设有一天我出事了,我一个电话能到场的有谁?",R.drawable.two);
    DateText date11 = new DateText("20120729", "你厌恶自己的生活,然而有人在梦想着过你的生活。",R.drawable.two);
    DateText date12 = new DateText("20130725", "非常爱非常爱你。可你却MD不知道",R.drawable.two);
    DateText date13 = new DateText("20140716", "就算现在的他对你再好,都比只是以前那个伤你最深的人也是现在最熟悉的陌生人,",R.drawable.two);
    DateText date14 = new DateText("20140711", "回顾中。总有些瞬间。能温暖整个以前。",R.drawable.two);
    DateText date15 = new DateText("20140710", "我最想旅游的地方,是暗恋者的心。",R.drawable.two);
    DateText date16 = new DateText("20140711", "我不是有益 让自己变得不像自己",R.drawable.two);
    DateText date17 = new DateText("20100712", "不要求,不一定是没有心声。不流泪,不一定是没有泪痕。不表达,不一定是不爱你",R.drawable.two);
    DateText date18 = new DateText("20140711", "谁苍白了谁的等待。谁无悔着谁的执着。",R.drawable.two);
    DateText date19 = new DateText("20140715", "网上作者呕心呖血码出的字,他们不费一兵一卒就能轻易地据为己有",R.drawable.three);
    DateText date20 = new DateText("20120723", "自从我遇见你那天開始,我的心就像跌进了深深的湖水",R.drawable.three);
    DateText date21 = new DateText("20150718", "有些东西,当你拥有时。你觉得理所应当。当你失去时,才知道自己没资格。

    ",R.drawable.three);
    DateText date22 = new DateText("20130706", "有时候上天没有给你想要的,不是由于你不配。而是你值得拥有更好的。

    ",R.drawable.three);
    DateText date23 = new DateText("20110714", "退出没结局的剧",R.drawable.three);
    DateText date24 = new DateText("20120726", "以前的现实,如今已是回顾。",R.drawable.three);
    DateText date25 = new DateText("20140325", "谁人曾照应过我的感受,待我温和吻过伤口,谁人曾介意我也不好受。为我出头碰过我的手",R.drawable.three);
    DateText date26 = new DateText("20140623", "人生归于尘埃如花瓣零落,然而人生生不息。花瓣飘零尘泥,依旧花开花落。",R.drawable.three);
    DateText date27 = new DateText("20140121", "如今,我们都应忘了对方,又一次去过彼此的生活。

    ",R.drawable.three);
    DateText date28 = new DateText("20140916", "爱上大声地啊地",R.drawable.three);
    DateText date29 = new DateText("20140712", "被人须要是种无法言表却又充满能量的安全感",R.drawable.one);
    DateText date30 = new DateText("20140710", "没有信的日子,如同一堆温柴,被回顾点着,一脑子的浓烟。

    ",R.drawable.two);
    list.add(date1);
    list.add(date2);
    list.add(date3);
    list.add(date4);
    list.add(date5);
    list.add(date6);
    list.add(date7);
    list.add(date8);
    list.add(date9);
    list.add(date10);
    list.add(date11);
    list.add(date12);
    list.add(date13);
    list.add(date14);
    list.add(date15);
    list.add(date16);
    list.add(date17);
    list.add(date18);
    list.add(date19);
    list.add(date20);
    list.add(date21);
    list.add(date22);
    list.add(date23);
    list.add(date24);
    list.add(date25);
    list.add(date26);
    list.add(date27);
    list.add(date28);
    list.add(date29);
    list.add(date30);
    }
    }

    哈哈代码基本上写完了。期间我们对时间进行了一下处理,用到了一个工具类:

    看方法:

    package com.zy.timeline;
    import java.util.Comparator;
    public class DateComparator implements Comparator<DateText> {
    @Override
    public int compare(DateText lhs, DateText rhs) {
    return rhs.getDate().compareTo(lhs.getDate());//时间比較排序
    }
    }

    package com.zy.timeline;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    public class TimeFormat {
    public static String format(String format, String time) {
    String result = "";
    SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//时间格式化
    try {
    Date date = df.parse(time);
    SimpleDateFormat df1 = new SimpleDateFormat(format);
    result = df1.format(date);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return result;
    }
    }

    好了代码也写完了,看下效果图啊:


    马蛋手机比較垃圾没有屏幕快照的功能。仅仅能拿另外一个手机来拍了,拍的效果不是非常好,见谅啊。

    最后附上源代码(想看下效果的能够看下linetime.zip最他妈讨厌那种下源代码还要积分的程序狗了


    下一篇计划把listView换成RecyclerView来实现,也顺便温习下RecyclerView的使用,不喜勿喷啊,小伙伴们偷笑,认为不错就给个赞。应该非常快吧,感觉加班前可以搞定的样子。加油小伙伴们,请继续关注时光轴系列篇 时光轴二之RecyclerView版时光轴效果

    come on ,enjoy it.

  • 相关阅读:
    Laravel中Contracts的理解和使用
    laravel 服务容器的用法
    linux 安装go环境
    权限设计-系统登录用户权限设计
    Laravel 中使用 JWT 认证的 Restful API
    使用laravel-wechat微信支付
    composer查看全局配置
    如何在 Laravel 项目中处理 Excel 文件
    laravel各种请求类
    Centos创建用户并授权
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7248766.html
Copyright © 2020-2023  润新知