1. 程式人生 > >Android自定義View之ListView實現時間軸效果:我只是個送快遞的。

Android自定義View之ListView實現時間軸效果:我只是個送快遞的。

先上效果圖:

這裡寫圖片描述

實現時間軸的原理

這裡寫圖片描述
listview的基本使用,相信大家都很熟悉。先在layout下新建一個xml佈局檔案,對應一個子項的listView的顯示內容。在上面的圖我們可以看到,每一項都是 有3個 textview控制元件,分別顯示日期、時間、和事件。之後新建一個介面卡,作為listview的介面卡,之後在mainactivity呼叫即可,我在這裡新建一個實體類,更容易操作。

新建一個子項.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="match_parent" android:orientation="vertical" >
<View android:id="@+id/view_1" android:layout_width="2dp" android:layout_height="15dp" android:layout_marginLeft
="30dp" android:background="#E9F01D" />
<TextView android:id="@+id/show_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/view_1" android:layout_marginLeft="30dp" android:text="" android:textSize
="12dp" />
<ImageView android:id="@+id/image" android:layout_width="15dp" android:layout_height="15dp" android:layout_below="@+id/view_1" android:layout_marginLeft="24dp" android:src="@drawable/timeline_green" /> <View android:id="@+id/view_2" android:layout_width="2dp" android:layout_height="45dp" android:layout_below="@+id/image" android:layout_marginLeft="30dp" android:background="#E9F01D" /> <RelativeLayout android:id="@+id/relative" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/image" android:layout_marginLeft="5dp" android:layout_marginTop="-20dp" android:layout_toRightOf="@+id/image" android:background="@drawable/timeline_content" android:padding="5dp" android:layout_marginRight="25dp"> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="5dp" android:text="03:22" android:textSize="14sp" /> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:layout_toRightOf="@id/time" android:text="由【江蘇蘇州中轉部】發往【江蘇蘇州公司】" android:textSize="14sp" /> </RelativeLayout> <TextView android:id="@+id/day" android:textColor="#fff" android:layout_marginLeft="15dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/view_2" android:layout_marginTop="-2dp" android:gravity="center" android:text="01月13日" android:background="@mipmap/timeline_month_day" android:textSize="8sp" /> <View android:id="@+id/view_5" android:layout_width="2dp" android:layout_height="10dp" android:layout_alignLeft="@+id/view_2" android:layout_below="@+id/day" android:background="#E9F01D" /> </RelativeLayout>

新建一個javabean,方便呼叫

程式碼如下:

```
/*
 *  專案名:  ListViewTime 
 *  包名:    com.example.xuhong.listviewtime
 *  檔名:   DataBean
 *  建立者:   XuHong
 *  建立時間:  2017/1/24 22:24
 *  描述:    javabean
 */
public class DataBean  {

    //天
    private String day;
    //時間
    private String time;
    //資訊
    private String msg;

    public DataBean(String day,String time,String msg){
        this.day=day;
        this.time = time;
        this.msg = msg;
    }
    public String getDay() {
        return day;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
    }

編寫父佈局(就一個ListView)

<?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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/base_color"
   >

    <ListView
        android:listSelector="#00000000"
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>


</LinearLayout>

子佈局的介面卡(ListViewAdapter.java)

import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;

/*
* 專案名: ListViewTime
* 包名: com.example.xuhong.listviewtime
* 檔名: ListViewAdapter
* 建立者: XuHong
* 建立時間: 2017/1/24 22:22
* 描述: 介面卡
*/
public class ListViewAdapter extends ArrayAdapter {
private int resourceID;

public ListViewAdapter(Context context, int resource, List<DataBean> objects) {
    super(context, resource, objects);
    resourceID =resource;
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    DataBean bean = getItem(position);

    ViewHolder viewHolder =null;

    View view;

    if (convertView == null) {

        view=LayoutInflater.from(getContext()).inflate(resourceID,parent,false);

        viewHolder = new ViewHolder();

        viewHolder.tv_day = (TextView) view.findViewById(R.id.day);
        viewHolder.tv_time = (TextView) view.findViewById(R.id.time);
        viewHolder.tv_msg = (TextView) view.findViewById(R.id.content);

        view.setTag(viewHolder);
    } else {
        view=convertView;
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.tv_day.setText(bean.getDay());
    viewHolder.tv_time.setText(bean.getTime());
    viewHolder.tv_msg.setText(bean.getMsg());

    return view;
}

class ViewHolder {
    private TextView tv_day;
    private TextView tv_time;
    private TextView tv_msg;

}
}

父佈局實現(MainActivity.java)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private ListView ListView;

private ListViewAdapter listviewadapter;

private List<DataBean> mList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //去掉陰影
    getSupportActionBar().setElevation(0);
    ListView= (android.widget.ListView) findViewById(R.id.listview);
    //去控制元件的邊緣陰影
    ListView.setDivider(null);
    initData();
    initView();
}

private void initData() {
        DataBean data =new DataBean("2月12號","08:23","京東快遞打包,即將出庫");
        mList.add(data);
        DataBean data2 =new DataBean("2月12號","09:30","快遞打包,上車,目的地:陽春");
        mList.add(data2);
        DataBean data3 =new DataBean("2月13號","07:23","到站陽春,即將送出");
        mList.add(data3);
        DataBean data4 =new DataBean("2月13號","13:23","快遞到達崗美,即將派送.");
        mList.add(data4);
        DataBean data5 =new DataBean("2月13號","18:23","請留意電話,派送人:小徐\nQQ:870189248");
        mList.add(data5);

}

private void initView() {
    listviewadapter = new ListViewAdapter(MainActivity.this, R.layout.layout_time,mList);
    ListView.setAdapter(listviewadapter);

}

}

OK!

相關推薦

Android定義ViewListView實現時間效果只是快遞

先上效果圖: 實現時間軸的原理 listview的基本使用,相信大家都很熟悉。先在layout下新建一個xml佈局檔案,對應一個子項的listView的顯示內容。在上面的圖我們可以看到,每一項都是 有3個 textview控制元件

Android定義View水波紋顯示進度效果

@Override protected void onDraw(Canvas canvas) { if (null != backgroundBitmap) { canvas.drawBitmap(createImage(), 0, 0, null);

android定義View仿通訊錄側邊欄滑動,實現A-Z字母檢索

我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

Android定義view實現帶checkbox的Snackbar

前言 最近專案要求實現一個類似於snackbar功能,但是又不完全是snackbar的外掛,本來想在Google提供的snackbar裡面進行更改,但是這樣太麻煩了,於是自己動手實現了一個snackbar。先看下效果圖: 1.要解決的問題 1.彈框裡面除了文字提示之外還有一個按鈕,這個按

Android定義View實現簡單炫酷的球體進度球

前言 最近一直在研究自定義view,正好專案中有一個根據下載進度來實現球體進度的需求,所以自己寫了個進度球,程式碼非常簡單。先看下效果: 效果還是非常不錯的。 準備知識 要實現上面的效果我們只要掌握兩個知識點就好了,一個是Handler機制,用於發訊息重新整理我們的進度球,一個是clip

Android定義view實現仿抖音雙擊點贊單擊暫停特效

       2018年抖音、快手、火山等短視訊App比較火,最近自己做短視訊專案時有個需求,就是類似抖音的點贊特效,單擊螢幕時視訊暫停,再次點選時視訊恢復播放,雙擊或者連續多次點選時出現點贊特效(飄小心心特效),而且是全屏可以隨意點選,都

Android定義View仿QQ側滑選單實現

最近,由於正在做的一個應用中要用到側滑選單,所以通過查資料看視訊,學習了一下自定義View,實現一個類似於QQ的側滑選單,順便還將其封裝為自定義元件,可以實現類似QQ的側滑選單和抽屜式側滑選單兩種選單。 下面先放上效果圖: 我們這裡的側

Android定義View導航欄(Fragment實現)

安卓輕量級底部導航欄 目前安卓開發中常常會用到底部導航欄這個控制元件,但是自己從零開始做一個又太麻煩。因此,我封裝了一個底部導航欄,同時,也做了一些修改,用於頂部也十分合適。下面是示例圖: 使用方法: 1.新增依賴 首先,在build.gradle檔案下加入 maven

Android定義 view圖片裁剪從設計到實現

android圖片剪下是常用的功能,因為部落格開發的是SDK不涉及到activity,所以就需要自定義裁剪功能,參閱了網上的大部分資料後,在github上一個封裝好的裁剪庫cropper,正好符合要求,本著拿來主義的思想,直接把原始碼clone嵌入到專案裡,然後

Android定義View分貝儀

一、說明        最近在整理自定義View方面的知識,偶爾看到meizu工具箱的分貝儀效果,感覺它的實效效果還挺好的,遂想自己模擬實現練練手,廢話不多說,直接開擼。 二、效果圖 首先看一下效果圖: 看效果還挺炫酷

Android定義ViewCanvas

https://www.jianshu.com/p/fb18c28d6627 用繼承View的方式來自定義View,我們就需要重寫onDraw方法,也就是得咱自己來畫圖了。畫圖就得用到畫筆和畫布,也就是Paint和Canvas。我們來了解下Canvas。 Canvas Canvas我們可

Android 定義ViewCanvas詳解

自定義View的相關文章: Android 實現一個簡單的自定義View Android 自定義View步驟 Android Paint詳解 Android 自定義View之Canvas相關方法說明 Android 自定義View例項之 “京東跑”

Android : 定義View流式佈局

寫了一個很簡單的佈局 這是周圍圓框的drawable <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

Android定義ViewgetTextBounds()

在Android自定義View的過程中一定會用到Paint,而paint屬性中有一個方法getTextBounds(String text,int start,int end,Rext bounds),它的中文解釋是:返回一個包含中文的矩形邊界,位置為(start,end) 英文解釋:Retur

Android定義View定義屬性

在Android開發中經常會用到自定義View的情況,而在自定義View時,自定義屬性是必須用到的。 1、新建一個自定義View如CustomView 它的自定義屬性主要是通過declare-styleable標籤為其配置自定義屬性。具體做法是:在res/values/目錄下增加一個reso

Android 定義View小例項-實現繪製打折標籤

前言 許多商城APP都會有商品打折的需求,而為文字新增下劃線直接設定style就可以完成,我們在這裡說的如下圖,也就是我們demo實現的效果圖。 1. 選取自定義View的方法 我們都知道自定義View有多種方式,比如繼承自View、ViewGroup或者繼承自現有的View子

Android -- 定義viewStepView

先看看實現的效果: 2,首先我們來看看我們常規的自定義view的基礎步驟吧         1,繼承View,重寫構造方法 2,自定義屬性 3,重寫onMeasure()測量控制元件高度 4,重寫onDra

Android 定義View 可隨意拖動的View

因為趕專案本人停更兩個月 從今天開始又可以更新了 今天說一下這個可隨意拖動的view 簡單說一下這個view效果 和 發展 一開始這種效果是使用在網頁端的特別是購物類 例如某寶 某東 購物車和客服視窗 都有使用這個懸浮可拖動的設計效果 後來才發展到的移動端 還有

Android 定義View咖啡動畫

文章目錄效果畫杯子畫杯墊畫煙霧 效果 大概思路 自定義view,直接繼承view 複寫onSizeChanged()方法,在此計算杯墊,杯子,煙霧效果的path 在onDraw()方法中,描繪杯墊,杯子 處理煙霧動畫效果 畫杯子 這裡需要畫兩部分內容,第

Android 定義View下雨動畫

文章目錄效果思路畫雲畫雨滴優化 效果 開始前先做個熱身( ˘•灬•˘ ) 自己實現比較容易,但是到了要出部落格整理思路,總結要點的時候就撓頭,不知雲所以,所以最簡單的還是 如果對安卓UI有興趣的朋友可以加我好友互相探討, 思路 思路比較簡單,整個view無