【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何自定義view仿淘寶快遞物流信息時(shí)間軸_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何自定義view仿淘寶快遞物流信息時(shí)間軸_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何自定義view仿淘寶快遞物流信息時(shí)間軸_第3頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何自定義view仿淘寶快遞物流信息時(shí)間軸_第4頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何自定義view仿淘寶快遞物流信息時(shí)間軸_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何自定義view仿淘寶快遞物流信息時(shí)間軸

這篇文章主要為大家展示了“Android如何自定義view仿淘寶快遞物流信息時(shí)間軸”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓在下帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Android如何自定義view仿淘寶快遞物流信息時(shí)間軸”這篇文章吧。效果圖自定義屬性<resources>

<declare-styleable

name="TimeLineView">

<attr

name="timelineRadius"

format="dimension"

/>

<attr

name="timelineHeadRadius"

format="dimension"

/>

<attr

name="timelineHeadColor"

format="color"

/>

<attr

name="timelineOtherColor"

format="color"

/>

<attr

name="timelineRadiusDistance"

format="dimension"

/>

<attr

name="timelineCount"

format="integer"

/>

<attr

name="timelineMarginTop"

format="dimension"

/>

<attr

name="timelineWidth"

format="dimension"

/>

</declare-styleable>

</resources>onDraw方法關(guān)鍵方法,寫了大量的代碼注釋,希望大家能看明白。@Override

protected

void

onDraw(Canvas

canvas)

{

//默認(rèn)設(shè)置時(shí)間軸的位置位于view的中間

viewWidth

=

getMeasuredWidth()

/

2;

//設(shè)置第一個(gè)節(jié)點(diǎn)的顏色

mPaint.setColor(timelineHeadColor);

/**

*

根據(jù)時(shí)間軸的節(jié)點(diǎn)數(shù)目,畫對(duì)應(yīng)的節(jié)點(diǎn)和軸

*/

for

(int

j

=

1;

j

<=

timelineCount;

j++)

{

/**

*

當(dāng)j==1,畫第一個(gè)節(jié)點(diǎn)的時(shí)候,有點(diǎn)特殊,我們需要在節(jié)點(diǎn)的外面再換一個(gè)圓環(huán)

*/

if

(j

==

1)

{

//畫筆設(shè)置為空心

canvas.drawCircle(viewWidth,

timelineHeadRadius

+

marginTop,

timelineRadius,

mPaint);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeWidth(5.0f);

//畫第一個(gè)節(jié)點(diǎn)外圍的圓環(huán)

canvas.drawCircle(viewWidth,

timelineHeadRadius

+

marginTop,

timelineHeadRadius,

mPaint);

//設(shè)置畫筆顏色,畫其他時(shí)間節(jié)點(diǎn)的顏色

mPaint.setColor(timelineOtherColor);

//畫筆設(shè)置為實(shí)心

mPaint.setStyle(Paint.Style.FILL);

/**

*

畫第一個(gè)節(jié)點(diǎn)下面的軸

*/

canvas.drawRect(new

Rect(viewWidth

-

timelineWidth

/

2,

(int)

(2

*

timelineHeadRadius

+

marginTop)

+

5,

viewWidth

+

timelineWidth

/

2,

(int)

(2

*

timelineHeadRadius

+

timelineRadiusDistance

+

marginTop

+

5)),

mPaint);

continue;

}

/**

*

畫時(shí)間軸的節(jié)點(diǎn),即畫圓形

*

圓心的x都是一樣的,view的中間

*

圓心的y的計(jì)算是根據(jù)節(jié)點(diǎn)的位置來(lái)計(jì)算的,例如:第一個(gè)節(jié)點(diǎn)的y是根據(jù)第一個(gè)節(jié)點(diǎn)距離上面的距離加上第一個(gè)節(jié)點(diǎn)的半徑:timelineHeadRadius

+

marginTop

*

其余的節(jié)點(diǎn)就是在一個(gè)節(jié)點(diǎn)的y的基礎(chǔ)上,加上兩倍半徑和節(jié)點(diǎn)之間的軸的長(zhǎng)度*節(jié)點(diǎn)數(shù):(2

*

timelineRadius

+

timelineRadiusDistance)

*

(j

-

1)

+

timelineHeadRadius

-

timelineRadius

+

marginTop

*

*/

canvas.drawCircle(viewWidth,

(2

*

timelineRadius

+

timelineRadiusDistance)

*

(j

-

1)

+

2

*

timelineHeadRadius

-

timelineRadius

+

marginTop,

timelineRadius,

mPaint);

/**

*

*

畫其余的軸

*

left:每個(gè)軸距離左邊距離都是一樣的時(shí)間軸的中心位置-1/2的時(shí)間軸的寬度

viewWidth

-

timelineWidth

/

2

*

top:

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

-

timelineRadiusDistance

+

2

*

(timelineHeadRadius-timelineRadius)+

marginTop)

*

right:每個(gè)軸距離右邊距離都是一樣的時(shí)間軸的中心位置+1/2的時(shí)間軸的寬度

viewWidth

+

timelineWidth

/

2

*

bottom:

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

+

2

*

(timelineHeadRadius-timelineRadius)+

marginTop)

*/

canvas.drawRect(new

Rect(viewWidth

-

timelineWidth

/

2,

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

-

timelineRadiusDistance

+

2

*

(timelineHeadRadius

-

timelineRadius)

+

marginTop),

viewWidth

+

timelineWidth

/

2,

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

+

2

*

(timelineHeadRadius

-

timelineRadius)

+

marginTop)),

mPaint);

}

}最后附上全部代碼package

com.demo.zes.timelinedemo;

import

android.content.Context;

import

android.content.res.TypedArray;

import

android.graphics.Canvas;

import

android.graphics.Color;

import

android.graphics.Paint;

import

android.graphics.Rect;

import

android.util.AttributeSet;

import

android.view.View;

/**

*

TODO:

document

your

custom

view

class.

*/

public

class

TimeLineView

extends

View

{

private

Paint

mPaint;

/**

*

第一個(gè)節(jié)點(diǎn)的外半徑

*/

private

float

timelineHeadRadius;

/**

*

第一個(gè)節(jié)點(diǎn)的顏色值

*/

private

int

timelineHeadColor;

/**

*

第二個(gè)節(jié)點(diǎn)的顏色值

*/

private

int

timelineOtherColor;

/**

*

時(shí)間線的節(jié)點(diǎn)數(shù)

*/

private

int

timelineCount;

/**

*

時(shí)間軸的位置

*/

private

int

viewWidth;

/**

*

時(shí)間軸到距離頂部的距離

*/

private

int

marginTop;

/**

*

時(shí)間軸的節(jié)點(diǎn)的半徑

*/

private

int

timelineRadius;

/**

*

時(shí)間軸節(jié)點(diǎn)之間的距離

*/

private

int

timelineRadiusDistance;

/**

*

時(shí)間軸的寬度

*/

private

int

timelineWidth;

/**

*

時(shí)間軸的高度

*/

private

float

timeLineViewHeight;

public

TimeLineView(Context

context)

{

this(context,

null);

}

public

TimeLineView(Context

context,

AttributeSet

attrs)

{

this(context,

attrs,

0);

}

public

TimeLineView(Context

context,

AttributeSet

attrs,

int

defStyle)

{

super(context,

attrs,

defStyle);

init(context,

attrs,

defStyle);

}

/**

*

初始化

*

*

@param

context

*

@param

attrs

*

@param

defStyle

*/

private

void

init(Context

context,

AttributeSet

attrs,

int

defStyle)

{

final

TypedArray

a

=

getContext().obtainStyledAttributes(

attrs,

R.styleable.TimeLineView,

defStyle,

0);

timelineRadiusDistance

=

(int)

a.getDimension(R.styleable.TimeLineView_timelineRadiusDistance,

convertDIP2PX(context,

20));

timelineHeadRadius

=

a.getDimension(R.styleable.TimeLineView_timelineHeadRadius,

convertDIP2PX(context,

10));

timelineRadius

=

(int)

a.getDimension(R.styleable.TimeLineView_timelineRadius,

convertDIP2PX(context,

5));

timelineHeadColor

=

a.getColor(R.styleable.TimeLineView_timelineHeadColor,

Color.parseColor("#73be36"));

timelineOtherColor

=

a.getColor(R.styleable.TimeLineView_timelineOtherColor,

Color.parseColor("#e0e0e0"));

timelineCount

=

a.getInteger(R.styleable.TimeLineView_timelineCount,

0);

timelineWidth

=

(int)

a.getDimension(R.styleable.TimeLineView_timelineWidth,

convertDIP2PX(context,

1));

marginTop

=

(int)

a.getDimension(R.styleable.TimeLineView_timelineMarginTop,

convertDIP2PX(context,

50));

a.recycle();

mPaint

=

new

Paint();

mPaint.setAntiAlias(true);

}

@Override

protected

void

onDraw(Canvas

canvas)

{

//默認(rèn)設(shè)置時(shí)間軸的位置位于view的中間

viewWidth

=

getMeasuredWidth()

/

2;

//設(shè)置第一個(gè)節(jié)點(diǎn)的顏色

mPaint.setColor(timelineHeadColor);

/**

*

根據(jù)時(shí)間軸的節(jié)點(diǎn)數(shù)目,畫對(duì)應(yīng)的節(jié)點(diǎn)和軸

*/

for

(int

j

=

1;

j

<=

timelineCount;

j++)

{

/**

*

當(dāng)j==1,畫第一個(gè)節(jié)點(diǎn)的時(shí)候,有點(diǎn)特殊,我們需要在節(jié)點(diǎn)的外面再換一個(gè)圓環(huán)

*/

if

(j

==

1)

{

//畫筆設(shè)置為空心

canvas.drawCircle(viewWidth,

timelineHeadRadius

+

marginTop,

timelineRadius,

mPaint);

mPaint.setStyle(Paint.Style.STROKE);

mPaint.setStrokeWidth(5.0f);

//畫第一個(gè)節(jié)點(diǎn)外圍的圓環(huán)

canvas.drawCircle(viewWidth,

timelineHeadRadius

+

marginTop,

timelineHeadRadius,

mPaint);

//設(shè)置畫筆顏色,畫其他時(shí)間節(jié)點(diǎn)的顏色

mPaint.setColor(timelineOtherColor);

//畫筆設(shè)置為實(shí)心

mPaint.setStyle(Paint.Style.FILL);

/**

*

畫第一個(gè)節(jié)點(diǎn)下面的軸

*/

canvas.drawRect(new

Rect(viewWidth

-

timelineWidth

/

2,

(int)

(2

*

timelineHeadRadius

+

marginTop)

+

5,

viewWidth

+

timelineWidth

/

2,

(int)

(2

*

timelineHeadRadius

+

timelineRadiusDistance

+

marginTop

+

5)),

mPaint);

continue;

}

/**

*

畫時(shí)間軸的節(jié)點(diǎn),即畫圓形

*

圓心的x都是一樣的,view的中間

*

圓心的y的計(jì)算是根據(jù)節(jié)點(diǎn)的位置來(lái)計(jì)算的,例如:第一個(gè)節(jié)點(diǎn)的y是根據(jù)第一個(gè)節(jié)點(diǎn)距離上面的距離加上第一個(gè)節(jié)點(diǎn)的半徑:timelineHeadRadius

+

marginTop

*

其余的節(jié)點(diǎn)就是在一個(gè)節(jié)點(diǎn)的y的基礎(chǔ)上,加上兩倍半徑和節(jié)點(diǎn)之間的軸的長(zhǎng)度*節(jié)點(diǎn)數(shù):(2

*

timelineRadius

+

timelineRadiusDistance)

*

(j

-

1)

+

timelineHeadRadius

-

timelineRadius

+

marginTop

*

*/

canvas.drawCircle(viewWidth,

(2

*

timelineRadius

+

timelineRadiusDistance)

*

(j

-

1)

+

2

*

timelineHeadRadius

-

timelineRadius

+

marginTop,

timelineRadius,

mPaint);

/**

*

*

畫其余的軸

*

left:每個(gè)軸距離左邊距離都是一樣的時(shí)間軸的中心位置-1/2的時(shí)間軸的寬度

viewWidth

-

timelineWidth

/

2

*

top:

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

-

timelineRadiusDistance

+

2

*

(timelineHeadRadius-timelineRadius)+

marginTop)

*

right:每個(gè)軸距離右邊距離都是一樣的時(shí)間軸的中心位置+1/2的時(shí)間軸的寬度

viewWidth

+

timelineWidth

/

2

*

bottom:

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

+

2

*

(timelineHeadRadius-timelineRadius)+

marginTop)

*/

canvas.drawRect(new

Rect(viewWidth

-

timelineWidth

/

2,

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

-

timelineRadiusDistance

+

2

*

(timelineHeadRadius

-

timelineRadius)

+

marginTop),

viewWidth

+

timelineWidth

/

2,

(int)

(j

*

(2

*

timelineRadius

+

timelineRadiusDistance)

+

2

*

(timelineHeadRadius

-

timelineRadius)

+

marginTop)),

mPaint);

}

}

public

float

getTimelineHeadRadius()

{

return

timelineHeadRadius;

}

public

void

setTimelineHeadRadius(float

timelineHeadRadius)

{

this.timelineHeadRadius

=

timelineHeadRadius;

invalidate();

}

public

int

getTimelineHeadColor()

{

return

timelineHeadColor;

}

public

void

setTimelineHeadColor(int

timelineHeadColor)

{

this.timelineHeadColor

=

timelineHeadColor;

invalidate();

}

public

int

getTimelineOtherColor()

{

return

timelineOtherColor;

}

public

void

setTimelineOtherColor(int

timelineOtherColor)

{

this.timelineOtherColor

=

timelineOtherColor;

invalidate();

}

public

int

getTimelineCount()

{

return

timelineCount;

}

public

void

setTimelineCount(int

timelineCount)

{

this.timelineCount

=

timelineCount;

invalidate();

}

public

int

getMarginTop()

{

return

marginTop;

}

public

void

setMarginTop(int

marginTop)

{

this.marginTop

=

marginTop;

invalidate();

}

public

int

getTimelineRadius()

{

return

timelineRadius;

}

public

void

setTimelineRadius(int

timelineRadius)

{

this.timelineRadius

=

timelineRadius;

invalidate();

}

public

int

getTimelineRadiusDistance()

{

return

timelineRadiusDistance;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論