自定義乙個voiceview音量調節控制項

2021-08-05 19:45:50 字數 2366 閱讀 4206

記得以前有乙個需求

首先定義voiceview

private

void

initview()

我在建立控制項的時候定義乙個init方法進行一些初始化,這裡有初始速度,矩形弧度,每個音量塊的寬度以及每個音量塊的高度,音量指示器等,這裡我把指示器的寬度設定為音量塊寬度的二倍。

好我們主要看一下draw方法裡面怎麼實現的。主要的邏輯都在這裡

protected

void

ondraw(canvas canvas) else

mvoiceitemmarginleft = (mmeasuredwidth - mrightbitmapwidthandheight - (mvoiceitemwidth * mspeedlength))/(mspeedlength+1);

int voiceleft;

int voiceright;

backgroundpaint.setcolor(color.white);

//設定初始的7個音量調節位置和大小 上下都是不變的變得是左右位置

for (int i = 0; i < mcurrvolum; i++)

}backgroundpaint.setcolor(color.parsecolor("#a4c2f4"));

for (int i = mcurrvolum; i < mspeedlength; i++)

}

由於這個控制項實現的比較單一所以實現細節直接寫裡面了沒有抽出來,

首先繪製矩形,然後我們判斷右邊的bitmap是否為null,因為這是提供的乙個開放方法這個是由我們設定進去的如果是null,那麼mrightbitmapwidthandheight設定為0,否則我們把它的寬和高都設定為整個控制項的高。

ok右邊的繪製完後,正式開始擼我們的音量啦~一開始我預設設定音量len=7我們分別繪製7個音塊

for (int i = 0; i

< mcurrvolum; i++)

每個音塊的左邊距離等我們設定的marginleft+音塊的寬度

然後開始繪製指示器point

//繪製point

if(i==(mcurrvolum-

1))

這裡我們把指示器預設繪製在第四檔的位置,這裡需要注意下,由於指示器的寬度是音塊寬度的二倍所以指示器的

左側距離=第四個音塊的左側距離-(指示器寬度-音塊寬度)/2

好了這裡我們指示器和音塊全部繪製完畢了

if(i==(mcurrvolum-1))
這裡為啥要去-1呢你想啊我們繪製音塊的時候是從0開始的,假如

mcurrvolum值是4當然要在index=3處繪製這個時候音塊長度為4

但是這個控制項不能是靜態的啊,我們要滑動控制它啊,我們重寫一下

ontouchevent方法

@override

public boolean ontouchevent(motionevent event)

return super.ontouchevent(event);

}

可以看到**並不複雜,在滑動和停止滑動時候都呼叫了getscrolllenth()這個方法是個什麼鬼我們貼上**看看

private

void

getscrolllength(motionevent event)

log.e("tag","volum:"+mcurrvolum);

if(monspeedclicklistener!=null)

}

這裡採用的方案1是當我們觸控到每個音塊最右邊的時候,這個音塊顯示或者消失,而方案2是觸控到音塊左邊的時候顯示消失,這個根據個人習慣選擇了。

我們用控制項寬度-最右側圖示的寬度-音塊的左邊距/音量長度就可以得到每個音塊+左邊距長度

我們根據這個值和我們手指滑動的距離跟新我們的音量大小,拿我們滑動的當前位置eventx/剛才計算的邊距 =當前音量位置然後把結果賦值給我們mcurrvolum重新繪製一下,音量就更新好啦。

最終我們實現的效果如下

自定義乙個死鎖

在鎖o1釋放之前需要等待鎖o2的釋放 在鎖o2釋放之前需要等待鎖o1的釋放.死在無限等待對方釋放鎖的迴圈中.這只是乙個簡單的死鎖 a需要b,b需要a 複雜一些的有 a需要b,b需要c,c需要a.public class demo6 implements runnable catch interrup...

自定義乙個TagLayout

自定義乙個標籤自動排版顯示的布局。效果 思路 一 確定布局的寬,高。寬度確定 所有行中,寬度最寬的行即為這個布局的寬。高度確定 所有行的高度加起來 即 為這個布局的高度。二 擺放子view思路 如果能夠確定每乙個child的 right 和 bottom 或者 left,top,那麼就可以遍歷每乙個...

實現乙個自定義元件

如果要建立乙個自定義元件,你需要重寫uicomponent類的某些方法,最少需要重寫如下方法 建構函式,createchildren commitproperties measure layoutchrome updatedisplaylist 基礎語句結構如下 package mycomponen...