最近在項目中使用到了seekbar和progressbar,且必須按照設計要求來進行設定,如下圖。要實作這個效果就必須對這兩個控件進行自定義。
一,seekbar
一開始要實作這個效果參考網上的自定義方法根本無法達到這個效果,沒辦法隻能投機取巧了。
1,背景刻度的圖檔我是用了一個imageview,然後在imageview上放一個seekbar。因為是個定制的平闆應用,分辨率是限定的1280*768,是以我使用的是absolutelayout這樣imageview和seekbar的位置和大小都是固定的了,估計在其他布局中這樣使用會有問題。
2,在布局檔案中的代碼如下:
[html]
view plaincopyprint?
<imageview
android:layout_width="400dip"
android:layout_height="95dip"
android:layout_x="830dip"
android:layout_y="484dip"
android:src="@drawable/seekbar_background_5" //刻度圖檔
android:scaletype="centercrop"
android:background="@null"
/>
<seekbar
android:id="@+id/sensor_sensitivity"
android:layout_width="360dip"
android:layout_height="64dip"
android:layout_x="850dip"
android:layout_y="498dip"
android:progressdrawable="@drawable/suretouch_seekbar_img"
android:thumb="@drawable/suretouch_seekbar_thumb"
style="?android:attr/progressbarstylehorizontal"
android:paddingleft="5dip"
android:paddingright="5dip"
android:paddingbottom="2dip"
android:maxheight="1dip" //注意:一定得設定進度條的高度,不然進度條會很高。
android:minheight="1dip"
android:max="100"
android:progress="0"
/>
3,自定義滑塊,在drawable檔案中加入自定義的xml檔案。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 按下狀态 -->
<item
android:state_pressed="true"
android:drawable="@drawable/seekbar_block" />
<!-- 普通無焦點狀态 -->
android:state_focused="false"
android:state_pressed="false"
android:drawable="@drawable/seekbar_block" />
</selector>
4,自定義進度條的顔色,同樣在drawable中加入自定義需要的xml檔案。
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/progress">
<clip>
<shape>
<gradient
android:startcolor="@color/big_title"
android:centercolor="@color/big_title"
android:endcolor="@color/big_title"
/>
</shape>
</clip>
</item>
</layer-list>
5,設定滑塊的位置,也就是當滑動滑塊後隻能讓其停在刻度上,要現實這個效果我采用的方法是當滑塊停止的時候判斷目前的值,比如第二個刻度是25,這裡在0到25中去個中間數比如13,也就是當滑塊滑到大于13小于25到50的中間數時就setprogress(25),這樣就設定在25的位置也就是第二個刻度位置。後面的以此類推。seekbar的事件中有個onstoptrackingtouch,代碼如下:
[java]
public void onstoptrackingtouch(seekbar seekbar) {
// todo auto-generated method stub
int seekprogress = mseekbar.getprogress();
if(seekprogress<13){
mseekbar.setprogress(0);
}else if(seekprogress>=13 && seekprogress<38){
mseekbar.setprogress(25);
}else if(seekprogress>=38 && seekprogress<63){
mseekbar.setprogress(50);
}else if(seekprogress>=63 && seekprogress<88){
mseekbar.setprogress(75);
}else if(seekprogress>=88){
mseekbar.setprogress(100);
}
}
對于progressbar的設定同樣是采用一個imageview為背景(外圍的黑框),在imageview上放一個progressbar控件,然後自定義進度條的顔色。隻是在調整它們之間的位置和大小的時候比較費時點,不管怎樣已經達到了想要的效果。