鍍金池/ 教程/ Android/ 第十章-可以拖動的ProgressBar-SeekBar
第十八章-ViewPager+FragmentStatePagerAdapter實現(xiàn)仿微信Tab
第十五章-GridView實現(xiàn)動態(tài)添加和刪除子項
第九章-進度條ProgressBar
第十二章-經(jīng)典的ListView
第十四章-GridView控件
第八章-時間相關(guān)控件
第七章-下拉框Spinner控件
第二章-EditText探秘
第二十章-Android菜單之上下文菜單
第十一章-各種對話框Dialog集錦
第二十一章-Android菜單之子菜單
第六章-切換類TextSwitcher和ImageSwitcher
第十七章-ViewPager切換界面
第五章-開關(guān)按鈕ToggleButton和Switch
第二十二章-PopupWindow浮動窗
第十六章-幻燈片ViewFlipper
第二十四章-RecyclerView動態(tài)添加、刪除及點擊事件
第三章-交互之王Button控件
第二十三章-全新控件RecyclerView
第一章-好玩的TextView
第十三章-ListView擴展(多選、全選、反選)
第四章-玩轉(zhuǎn)單選和多選按鈕
第十章-可以拖動的ProgressBar-SeekBar
第十九章-Android菜單之選項菜單

第十章-可以拖動的ProgressBar-SeekBar

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è)置帶有刻度的背景。