SeekBar可拖动进度条

简介

        Android中的SeekBar是一个用户界面组件,继承自ProgressBar(拥有相应方法),并扩展了一些特定于滑块交互的属性和方法。允许用户通过拖动一个滑块在一个预定区间内选择一个值。这种控件非常适合用于实现音量控制、屏幕亮度调整、播放进度调节等交互场景。

一、常用属性

这些属性通常在XML布局文件中设置,也可以通过代码动态设置。

属性一览:

  • android:max: 设定滑动条的最大值,默认为100。
  • android:progress: 设置滑动条的初始进度值,默认为0。
  • android:thumb: 自定义滑块(拇指)的图标或样式。
  • android:thumbOffset: 设置滑块中心点与其实际位置的偏移量。
  • android:progressDrawable: 自定义进度条的背景样式,可以是颜色或渐变。
  • android:secondaryProgress: 设置次要进度的值,通常用于显示额外信息,如缓冲进度。
  1. 1.android:thumb:

    • 作用: 此属性允许你指定一个Drawable资源来作为滑块(thumb)的外观。你可以使用任何图形资源,比如图片或者shape drawable,来定义滑块的样式和外观。
    • 示例<SeekBar android:thumb="@drawable/custom_thumb" ... />
  2. 2.android:thumbOffset:

    • 作用: 指定滑块相对于其自然位置的水平偏移量。这可以在滑块位于进度条的最小值或最大值时调整其位置,以避免可能的遮挡问题或其他视觉上的不协调。
    • 示例<SeekBar android:thumbOffset="10dp" ... />
    • 注意: 这个偏移量是相对于滑块的中心点计算的。
  3. 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): 用户停止触摸滑块时被调用。
设置监听器

        这一行代码的作用是为名为seekBarSeekBar实例设置一个监听器。这个监听器是一个实现了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,用来展示当前进度值和最大值,然后将这个信息设置到名为textViewTextView控件中显示,实现了即时反馈进度变化的功能。
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可拖动进度条博客文章案例效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值