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。