SeekBar的繼承結(jié)構(gòu)如下:
public class
SeekBar
extends AbsSeekBar
java.lang.Object
? android.view.View
? android.widget.ProgressBar
? android.widget.AbsSeekBar
? android.widget.SeekBar
可以看出SeekBar繼承自ProgressBar,因此ProgressBar的屬性和方法在SeekBar中也同樣適用,這里把SeekBar理解成可以拖動的ProgressBar。 API文檔中定義了SeekBar一個獨特的屬性thumb,它可以在改變SeekBar的拖動塊。判斷SeekBar的拖動狀態(tài)和拖動進度可以實現(xiàn)SeekBar.OnSeekBarChangeListener接口,下面通過一個簡單的實例來了解一下它們的用法。 主布局文件代碼(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<SeekBar
android:id="@+id/seekbar"
android:thumb="@mipmap/ic_launcher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100" />
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
引入了一個SeekBar組件,并且設(shè)置其thumb屬性為一個圖片,這樣可以改變滑塊樣式。 MainActivity代碼(MainActivity.java)
public class MainActivity extends AppCompatActivity {
private SeekBar seekBar;
private TextView textView;
private StringBuffer stringBuffer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar=(SeekBar)findViewById(R.id.seekbar);
textView=(TextView)findViewById(R.id.tv);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {//設(shè)置滑動監(jiān)聽
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
stringBuffer.append("正在拖動"+progress+"\n");
textView.setText(stringBuffer);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
stringBuffer=new StringBuffer();
stringBuffer.append("開始拖動+\n");
textView.setText(stringBuffer);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
stringBuffer.append("停止拖動+\n");
textView.setText(stringBuffer);
}
});
}
}
通過setOnSeekBarChangeListener方法設(shè)置了SeekBar的滑動監(jiān)聽,這里要覆寫三個方法: ? onProgressChanged(SeekBar seekBar, int progress, boolean fromUser):SeekBar值變化時觸發(fā)。 ? onStartTrackingTouch(SeekBar seekBar):開始拖動時觸發(fā)。 ? onStopTrackingTouch(SeekBar seekBar):停止拖動時觸發(fā)。
運行項目實例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/10-1.png" alt="這里寫圖片描述" />
拖動滑塊,首先打印開始拖動,然后觸發(fā)正在拖動時間,最后是停止拖動事件觸發(fā)。 SeekBar還有哪些應(yīng)用場景呢?發(fā)揮我們的想象,應(yīng)該說最常用的就是音量調(diào)節(jié)上了,下面通過一個實例講解一下如何通過SeekBar改變系統(tǒng)音量。 主布局文件代碼(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<SeekBar
android:id="@+id/sb_volume"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="10" />
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
</LinearLayout>
放置了一個SeekBar拖動改變系統(tǒng)音量,TextView用于顯示當(dāng)前音量百分比。 MainActivity代碼(MainActivity.java)
public class MainActivity extends AppCompatActivity {
private SeekBar seekBar;
private TextView textView;
private int maxVolume,currentVolume;
private AudioManager audioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar=(SeekBar)findViewById(R.id.sb_volume);
textView=(TextView)findViewById(R.id.tv);
audioManager= (AudioManager) getSystemService(Context.AUDIO_SERVICE);//獲得音量管理類
maxVolume=audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//獲得系統(tǒng)最大音量
currentVolume=audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);//獲得當(dāng)前系統(tǒng)音量
seekBar.setMax(maxVolume);//將系統(tǒng)最大音量設(shè)置為最大進度
seekBar.setProgress(currentVolume);//將系統(tǒng)當(dāng)前音量設(shè)置為當(dāng)前進度
textView.setText(currentVolume * 100 / maxVolume + "%");//設(shè)置音量顯示的百分比
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);//設(shè)置音量
textView.setText(progress * 100 / maxVolume + "%");
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
}
通過getSystemService(Context.AUDIO_SERVICE)獲取系統(tǒng)音量管理類AudioManager對象。調(diào)用getStreamMaxVolume方法獲得系統(tǒng)最大音量,調(diào)用getStreamVolume方法獲取系統(tǒng)當(dāng)前音量。 設(shè)置滑動監(jiān)聽,在正在滑動的事件監(jiān)聽里利用setStreamVolume方法設(shè)置系統(tǒng)音量,改方法需要傳入三個參數(shù),第一個是音頻類型(AudioManager.STREAM_MUSIC),第二個是進度(progress),第三個是標(biāo)識位(0)。 運行實例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/10-2.png" alt="這里寫圖片描述" />
為了測試是否真正改變了系統(tǒng)音量,可以播放音樂然后進行測試,可以發(fā)現(xiàn)確實改變了系統(tǒng)音量。 在應(yīng)用中,經(jīng)常會碰到調(diào)節(jié)字體大小,一般字體大小只有幾種選擇,這時使用SeekBar時就要考慮設(shè)置檔位。這里模擬設(shè)置音量大小的功能,同樣也是三個檔位,并對應(yīng)三張不同的音量圖片。 主布局文件代碼(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/iv"
android:layout_gravity="center"
android:src="@drawable/min"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity代碼(MainActivity.java)
public class MainActivity extends AppCompatActivity {
private SeekBar seekBar;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar=(SeekBar)findViewById(R.id.seekBar);
imageView=(ImageView)findViewById(R.id.iv);
seekBar.setMax(20);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
if(seekBar.getProgress()<=5){
imageView.setImageResource(R.drawable.min);
seekBar.setProgress(0);
}else if(seekBar.getProgress() > 5&&seekBar.getProgress()<15){
seekBar.setProgress(10);
imageView.setImageResource(R.drawable.middle);
}else {
seekBar.setProgress(20);
imageView.setImageResource(R.drawable.max);
}
}
});
}
}
首先調(diào)用setMax方法,設(shè)置了最大進度值為20,然后設(shè)置了setOnSeekBarChangeListener監(jiān)聽,覆寫三個方法,其中在onStopTrackingTouch中由seekBar.getProgress方法,獲取現(xiàn)在的進度,當(dāng)進度小于5時,設(shè)置進度為零;當(dāng)進度為(5,15)時,設(shè)置進度為10;當(dāng)進度為[15,20]時,設(shè)置進度為20。這時就相當(dāng)于有了3個檔位,即0檔、10檔和20檔,每個檔位并對應(yīng)不同的圖片。 運行實例:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/10-3.png" alt="這里寫圖片描述" />
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/10-4.png" alt="這里寫圖片描述" />
SeekBar只能停在中間或兩端,因此只有三個檔位,若想更直觀的看出檔位,可以為SeekBar設(shè)置帶有刻度的背景。