Android开发:从0到1 (清华开发者书库)
上QQ阅读APP看书,第一时间看更新

7.7 拖动栏

拖动栏(SeekBar)是一种可以拖动的进度栏,用户能使用该控件调节进度,所以常应用在播放器应用中。此外,还可以设置连续数值。在如图7-27所示设置界面中,可以调节声音的大小。拖动栏也可以有两层进度栏,有的在线播放器利用第二层进度栏显示缓存的进度,如图7-28所示。

图7-27 Android拖动栏

图7-28 具有二层进度栏的拖动栏

7.7.1 SeekBar

拖动栏对应类是android.widget.SeekBar,类图如图7-29所示,从图中可见android. widget.SeekBar继承了android.widget.ProgressBar,这也说明SeekBar是一种进度栏。

图7-29 SeekBar类图

android.widget.SeekBar继承android.widget.ProgressBar,拖动栏也具有android:max、android:progress和android:secondaryProgress等属性。此外,android:thumb是拖动栏特有属性,通过该属性可以自定义滑块样式。

7.7.2 实例:使用拖动栏

图7-30是使用拖动栏实例,在屏幕上有两个拖动栏,上面是标准的拖动栏,而下面是自定义的拖动栏滑块。拖曳滑块可以改变其进度。

图7-30 拖动栏实例

布局文件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/seekBar1"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:max="100"                                                       ①
              android:progress="50"                                                   ②
              android:secondaryProgress="75"/>                                        ③
          <SeekBar
              android:id="@+id/seekBar2"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:max="100"
              android:progress="30"
              android:thumb="@mipmap/handle_hover"/>                                  ④

      </LinearLayout>

上述代码第①、②、③行是设置seekBar1的android:max、android:progress和android:secondaryProgress,虽然设置了第二层进度栏,但是拖动滑块所改变的只是第一层进度栏。

seekBar2的设置类似于seekBar1,只是没有设置android:secondaryProgress属性。另外,代码第④行的android:thumb="@mipmap/handle_hover"是设置滑块图片,handle_hover是存放在res\mipmap下面的png图片。

MainActivity.java代码如下:

        public class MainActivity extends AppCompatActivity
                    implements SeekBar.OnSeekBarChangeListener{                                 ①
            TextView mProgressText;
            static String TAG ="SeekerBar";

            @Override
            protected void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                mProgressText =(TextView) findViewById(R.id.progress);  
                SeekBar seekBar1 =(SeekBar) findViewById(R.id.seekBar1);                        ②
                seekBar1.setOnSeekBarChangeListener(this);                                      ③
                SeekBar seekBar2 =(SeekBar) findViewById(R.id.seekBar2);                        ④
                seekBar2.setOnSeekBarChangeListener(this);                                      ⑤
            }
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){     ⑥
                mProgressText.setText("当前进度:"+ progress +"%");
                Log.i(TAG, "当前进度:"+ progress +"%");
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar){                                  ⑦
                Log.i(TAG, "开始拖动");
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar){                                   ⑧
                Log.i(TAG, "停止拖动");
            }
        }

上述代码第①行是声明实现拖动栏事件处理接口SeekBar.OnSeekBarChangeListen-er,接口要求实现的方法见代码第⑥、⑦、⑧行,其中代码第⑥行的onProgressChanged()方法SeekBar在进度变化时触发,代码第⑦行的onStartTrackingTouch()方法是用户开始拖动滑块时触发,代码第⑧行的onStopTrackingTouch()方法是用户停止拖动滑块时触发。

代码第②行是获取seekBar1对象,代码第③行是注册seekBar1事件监听器为this。代码第④行是获取seekBar2对象,代码第⑤行是注册seekBar2事件监听器为this。