【移動應(yīng)用開發(fā)技術(shù)】android中怎么自定義WaveView水波紋控件_第1頁
【移動應(yīng)用開發(fā)技術(shù)】android中怎么自定義WaveView水波紋控件_第2頁
【移動應(yīng)用開發(fā)技術(shù)】android中怎么自定義WaveView水波紋控件_第3頁
【移動應(yīng)用開發(fā)技術(shù)】android中怎么自定義WaveView水波紋控件_第4頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】android中怎么自定義WaveView水波紋控件

這期內(nèi)容當(dāng)中在下將會給大家?guī)碛嘘P(guān)android中怎么自定義WaveView水波紋控件,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。引入你的工程在項(xiàng)目的根目錄下的build.gradle文件中添加如下代碼:allprojects

{

repositories

{

...

maven

{

url

'https://jitpack.io'

}

}

}在你需要引用的module中添加如下依賴:dependencies

{

compile

'com.github.onlynight:WaveView:1.0.0'

}使用布局文件中添加view:<com.github.onlynight.waveview.WaveView

android:id="@+id/waveView1"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

app:isCircle="false"

app:period="4"

app:waveHeightPercent="0.5"

app:waveRange="15dp"

app:waveSpeed="10"

app:waveStrokeWidth="3dp"/>activity中需要手動啟動水波紋mWaveView1

=

(WaveView)

findViewById(R.id.waveView1);

//

when

you

want

start

wave

you

should

call

WaveView#start()

method.

mWaveView1.start();

//

when

you

want

stop

wave

you

should

call

WaveView#stop()

method.

mWaveView1.stop();View屬性說明<declare-styleable

name="WaveView">

<!--

define

wave

speed,

example

value

10

-->

<attr

name="waveSpeed"

format="float"/>

<!--

define

wave

range,

example

value

15dp

-->

<attr

name="waveRange"

format="dimension|reference"/>

<!--

define

wave

1

color

-->

<attr

name="wave1Color"

format="color|reference"/>

<!--

define

wave

2

color

-->

<attr

name="wave2Color"

format="color|reference"/>

<!--

define

wave

height

percent,

the

value

is

between

0

to

1

-->

<attr

name="waveHeightPercent"

format="float"/>

<!--

define

paint

stroke

width,

if

you

want

optimizing

view,

you

should

change

the

stroke

width

more-->

<attr

name="waveStrokeWidth"

format="dimension|reference"/>

<!--

if

the

view

is

circle

-->

<attr

name="isCircle"

format="boolean"/>

<!--

the

sine

wave

period,

value

range

0

to

all

-->

<attr

name="period"

format="float"/>

</declare-styleable>實(shí)現(xiàn)原理我們視覺上看到的是水波紋,實(shí)際上只是一個正弦波和余弦波向左位移,然后將三角函數(shù)的周期加長,在一個view中不顯示整個三角函數(shù)的的波形,這樣從視覺上來說就是水波紋效果啦。根據(jù)上面的分析,我們知道我們需要計(jì)算一個正弦波和一個余弦波,并且根據(jù)時間的推移將正弦波或者余弦波向左或者向右平移,最后每次計(jì)算完波形圖的時候繪制下來就完成啦。下面我們來看下WaveView中的關(guān)鍵代碼:private

void

drawWave(Canvas

canvas,

int

width,

int

height)

{

setPaint();

double

lineX

=

0;

double

lineY1

=

0;

double

lineY2

=

0;

for

(int

i

=

0;

i

<

width;

i

+=

mStrokeWidth)

{

lineX

=

i;

if

(mIsRunning)

{

lineY1

=

mWaveRange

*

Math.sin((mAngle

+

i)

*

Math.PI

/

180

/

mPeriod)

+

height

*

(1

-

mWaveHeightPercent);

lineY2

=

mWaveRange

*

Math.cos((mAngle

+

i)

*

Math.PI

/

180

/

mPeriod)

+

height

*

(1

-

mWaveHeightPercent);

}

else

{

lineY1

=

0;

lineY2

=

0;

}

canvas.drawLine((int)

lineX,

(int)

lineY1,

(int)

lineX

+

1,

height,

mWavePaint1);

canvas.drawLine((int)

lineX,

(int)

lineY2,

(int)

lineX

+

1,

height,

mWavePaint2);

}

}可以看到,這里沒有選擇path進(jìn)行繪制,因?yàn)閜ath繪制無法滿足需求,這里通過畫豎線;計(jì)算每個點(diǎn)起始的位置,然后從這個點(diǎn)畫一條線到view的底部,然后循環(huán)多次直到view的邊界處結(jié)束繪制,這樣就看到正弦波啦;這時候在每次繪制過程中給三角函數(shù)添加一個偏移量,這樣每次計(jì)算的時候波形就會偏移;最后就完成啦。有個地方有個坑需要注意,這里可以設(shè)置view為圓形;常規(guī)的思路是畫完以后再將其切成一個圓形,我嘗試了各種方法證明這種思路有問題;最后發(fā)現(xiàn)需要先限定canvas的繪制區(qū)域,然后再將圖形繪制到view上去,這樣才能實(shí)現(xiàn)clip的效果。@Override

protected

void

onDraw(Canvas

canvas)

{

super.onDraw(canvas);

if

(mIsRunning)

{

int

height

=

getHeight();

int

width

=

getWidth();

//

這里要注意執(zhí)行的順序

clipContainer(canvas,

width,

height);

drawWave(canvas,

width,

height);

}

}

private

void

clipContainer(Canvas

canvas,

int

width,

int

height)

{

if

(mIsCircle)

{

mContainerPath.reset();

ca

溫馨提示

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

評論

0/150

提交評論