简介
Android中的SeekBar
是一个用户界面组件,继承自ProgressBar(拥有相应方法)
,并扩展了一些特定于滑块交互的属性和方法。允许用户通过拖动一个滑块在一个预定区间内选择一个值。这种控件非常适合用于实现音量控制、屏幕亮度调整、播放进度调节等交互场景。
一、常用属性
这些属性通常在XML布局文件中设置,也可以通过代码动态设置。
属性一览:
- android:max: 设定滑动条的最大值,默认为100。
- android:progress: 设置滑动条的初始进度值,默认为0。
- android:thumb: 自定义滑块(拇指)的图标或样式。
- android:thumbOffset: 设置滑块中心点与其实际位置的偏移量。
- android:progressDrawable: 自定义进度条的背景样式,可以是颜色或渐变。
- android:secondaryProgress: 设置次要进度的值,通常用于显示额外信息,如缓冲进度。
-
1.android:thumb:
- 作用: 此属性允许你指定一个Drawable资源来作为滑块(thumb)的外观。你可以使用任何图形资源,比如图片或者shape drawable,来定义滑块的样式和外观。
- 示例:
<SeekBar android:thumb="@drawable/custom_thumb" ... />
-
2.android:thumbOffset:
- 作用: 指定滑块相对于其自然位置的水平偏移量。这可以在滑块位于进度条的最小值或最大值时调整其位置,以避免可能的遮挡问题或其他视觉上的不协调。
- 示例:
<SeekBar android:thumbOffset="10dp" ... />
- 注意: 这个偏移量是相对于滑块的中心点计算的。
-
3.android:
Theme:
主题(Theme)
是指一系列属性的集合,这些属性定义了应用程序或其部分(如单个活动或组件)的整体视觉外观和行为。主题控制着诸如颜色、字体、背景、按钮样式以及其他用户界面元素等方面,使得开发者能够统一和定制应用的外观风格,无需为每个单独的UI组件设置样式。通过应用不同的主题,开发者可以轻松改变应用程序的外观,比如从亮色主题切换到暗色主题,或者实现与Android系统默认风格不同的个性化设计。
二、常用方法
这些方法通过Java或Kotlin代码调用来控制和获取SeekBar
的状态。
方法一览:
- setMax(int max): 设置滑动条的最大值。
- getMax(): 获取滑动条的最大值。
- getProgress(): 获取当前滑块所在位置的进度值。
- setProgress(int progress): 设置滑块当前位置的进度值。
- setOnSeekBarChangeListener(OnSeekBarChangeListener listener): 设置滑动条的监听器,用于监听进度变化、触摸开始与结束事件。
- incrementProgressBy(int diff): 增加进度值,
diff
为增量。 - setSecondaryProgress(int secondaryProgress): 设置次要进度值。
-
setSecondaryProgressTintList:第二进度条颜色
setSecondaryProgressTintList第二进度条颜色:
setSecondaryProgressTintList
是一个用于设置 SeekBar
第二进度条颜色的方法。在 SeekBar
中,除了主要进度条(表示当前进度)之外,还有一个可选的第二进度条,用于指示其他非当前进度的相关信息,比如下载文件时已下载部分与总下载量的比例区分。这个方法接受一个 ColorStateList
类型的参数,用于定义不同状态下第二进度条的颜色。ColorStateList
允许你根据视图的状态(如按下、聚焦、默认等)设置不同的颜色。
应用实例:
seekBar.setSecondaryProgress(progress+10);
int Second = getColor(com.google.android.material.R.color.material_dynamic_primary20);
ColorStateList colorStateList = ColorStateList.valueOf(Second);
seekBar.setSecondaryProgressTintList(colorStateList);
在这段代码中,首先通过getColor
获取一个颜色资源作为第二进度条的颜色,然后创建一个基于这个颜色的 ColorStateList
,最后通过 setSecondaryProgressTintList
方法将这个颜色应用于 SeekBar
的第二进度条上。
请注意,要使 setSecondaryProgressTintList
生效,你需要先设置一个有效的第二进度值,使用 setSecondaryProgress(int secondaryProgress)
方法。如果第二进度没有被设置,即使更改了颜色也不会显示效果。
SeekBar监听方法(三大方法)详解(setOnSeekBarChangeListener):
当设置了OnSeekBarChangeListener
后,可以利用以下回调方法处理用户交互:
- onProgressChanged(SeekBar seekBar, int progress, boolean fromUser): 滑块位置改变时被调用,
progress
是新的进度值,fromUser
指示改变是否由用户操作引起。 - onStartTrackingTouch(SeekBar seekBar): 用户开始触摸滑块时被调用。
- onStopTrackingTouch(SeekBar seekBar): 用户停止触摸滑块时被调用。
设置监听器
这一行代码的作用是为名为seekBar
的SeekBar
实例设置一个监听器。这个监听器是一个实现了SeekBar.OnSeekBarChangeListener
接口的匿名内部类,用于捕捉并响应用户与SeekBar
的交互。
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { ... });
onProgressChanged 方法
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
String seekbar_progress = "当前值" + seekBar.getProgress() + ",最大值" + seekBar.getMax();
textView.setText(seekbar_progress);
}
- 当用户拖动
SeekBar
的滑块,导致进度值发生变化时,这个方法会被触发。 - 参数
seekBar
指的是发生改变的SeekBar
对象,尽管在这个方法内部通常不需要直接使用它。 int progress
表示滑块当前所在的进度值,取值范围从0(最小值)到SeekBar.getMax()
(最大值)。boolean fromUser
表明这次进度改变是否由用户操作引起(true)还是程序设定(false)。在这个例子中,我们只关注用户操作。- 该方法内部,首先构造了一个字符串
seekbar_progress
,用来展示当前进度值和最大值,然后将这个信息设置到名为textView
的TextView
控件中显示,实现了即时反馈进度变化的功能。
onStartTrackingTouch 方法
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
textView.setText("开始触摸并滑动,如暂停某些动画或音乐播放");
}
当用户开始触摸并拖动滑块时,这个方法被调用。这里没有具体的实现代码,但你可以根据需要添加逻辑,比如暂停某些动画或音乐播放等。
onStopTrackingTouch 方法
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
textView.setText("完成滑动,并执行调整音量、屏幕亮度或视频等");
}
当用户完成滑动并抬起手指时,此方法被调用。这也是一个常见的执行特定操作的地方,比如应用滑块选定的值(如调整音量、屏幕亮度等),或者恢复因触摸开始而暂停的操作。
三、案例xml布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<SeekBar
android:id="@+id/seekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="270dp"
android:max="100"
android:thumb="@drawable/icon_24dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="@+id/seekBar"
app:layout_constraintTop_toBottomOf="@+id/seekBar" />
</androidx.constraintlayout.widget.ConstraintLayout>
四、案例代码
public class MainActivity extends AppCompatActivity {
TextView textView;
SeekBar seekBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
seekBar = findViewById(R.id.seekBar);
textView = findViewById(R.id.textView);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
seekBar.setSecondaryProgress(progress+10);
int Second = getColor(com.google.android.material.R.color.material_dynamic_primary20);
ColorStateList colorStateList = ColorStateList.valueOf(Second);
seekBar.setSecondaryProgressTintList(colorStateList);
float bai = (seekBar.getSecondaryProgress()/seekBar.getMax())*100;
String seekbar_progress = "当前值"+seekBar.getProgress()+
",当前加载"+seekBar.getSecondaryProgress()+",最大值"+seekBar.getMax();
textView.setText(seekbar_progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
textView.setText("开始触摸并滑动,如暂停某些动画或音乐播放");
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
textView.setText("完成滑动,并执行调整音量、屏幕亮度或视频等");
}
});
}
}
五、案例效果
SeekBar可拖动进度条博客文章案例效果