時間軸控制項TimeLineView的實現

2021-07-25 06:25:33 字數 3016 閱讀 2527

首先來看看效果圖吧,可以根據需要設定出很炫的效果

android中經常會用到時間軸,那麼如何實現時間軸呢?首先我們了解時間軸的構成

(1)時間球

(2)直線

(3)位置

下面介紹乙個時間軸實現的開源**:

把這幾個問題解決再掌握基本的繪製過程就可以實現時間軸了。下面先來看**。

(1)定義屬性,使用者可以自定義的屬性值

<?xml version="1.0" encoding="utf-8"?>

(2)**實現

import android.content.context;

import android.content.res.typedarray;

import android.graphics.canvas;

import android.graphics.rect;

import android.graphics.drawable.drawable;

import android.util.attributeset;

import android.view.view;

/** * 時間軸控制項

*/public class timelineview extends view

private void init(attributeset attrs)

if(mbottomtimeball == null)

if(mstartline == null)

if(mendline == null)

}@override

protected void onmeasure(int widthmeasurespec, int heightmeasurespec)

/*** 初始化時間軸控制項的位置大小等

* */

private void inittimelineview() else

int centerx = mbounds.centerx();

int lineleft = centerx - (mlinewidth >> 1);

if(mistoplinevisible && mstartline!=null)

if(mendline != null)

if(misbottomballvisible && mbottomtimeball != null)

}@override

protected void ondraw(canvas canvas)

if(mistoplinevisible && mstartline != null)

if(mendline != null)

if(misbottomballvisible && mbottomtimeball != null)

}/**

* 設定頂部時間球

* */

public void settoptimeballdrawable(drawable ball)

/*** 設定底部時間球

* */

public void setbottomtimedrawable(drawable ball)

/*** 時間球大小

* */

public void settimeballsize(int ballsize)

/*** 時間球中心位於頂部的距離

* */

public void setballmargintop(int top)

/*** 時間軸寬度

* */

public void setlinewidth(int width)

/*** 頂部時間線是否可見

* */

public void settoplinevisible(boolean visible)

/*** 底部時間球是否可見

* */

public void setbottomballvisible(boolean visible)

}

上述**200行左右,核心的**也非常少,在控制項的構造方法裡面,把使用者自定義的值獲取到,如果沒有定義,使用預設值。在onmeasure裡面計算好寬高,以及時間球,直線的位置,然後在控制項的ondraw方法中把它繪製好。基本邏輯比較簡單

(3)使用,把它加到xml布局當中,設定一些屬性值,也可以在**中重新設定一些值

android:id="@+id/time_line"

android:layout_width="8dip"

android:layout_height="match_parent"

**重新設定屬性,具體**可以檢視原始碼裡面的demo

timelineview timelineview = (timelineview) convertview.findviewbyid(r.id.time_line);

textview.settext(mdata.get(position));

timelineview.settoplinevisible(false);

timelineview.setbottomballvisible(false);

if(position != 0)

if(getcount() - 1 == position)

switch (position % 3)

case 1 :

case 2 :

}/*呼叫下面強制繪製,否則會出現顯示錯位問題*/

timelineview.invalidate();

注意:

在listview中使用的時候,由於adapter使用了快取,因此如果時間軸控制項顯示不一致的情況下,使用快取會導致顯示錯位問題,這時可以呼叫invalidate強制繪製即可。具體的實現,在

有demo可以看到效果。

Android時間軸控制項 WheelView

在做時間軸或者某些型別的選擇時,有時候設計師會給我們出類似下面的效果 因此,我們就需要重新自定義scrollview,也就是移動端常用的時間軸控制項 wheelview 實現方式直接上 public class wheelview extends scrollview private context...

自繪時間軸控制項

控制項 標頭檔案 pragma once ctimeaxisctrl class ctimeaxisctrl public cwnd private colorref m clrbackground,m clrtext,m clrgrid,m clrleftarea cfont m fontymd,...

mysql 時間軸 使用MySQL計算時間軸的變化

我是mysql的新手,我需要你的幫助.我有一張包含類似資料的 robotposx robotposy robotposdir robotshortestpath 0.1 0.2 15 1456 0.2 0.3 30 1456 0.54 0.67 15 1456 0.68 0.98 22 1234 0...