介绍
拖动条与进度条类似,所不同的是,拖动条允许用户拖动滑块来改变值,通常用于实现对某种数值的调节。
基本语法:
<SeekBar
android:layout_height="wrap_content"
android:id="@+id/seekBar1"
android:layout_width="match_parent">
</SeekBar>
- SeekBar 组件允许用户改变拖动滑块的外观,这可以使用 android:thumb 属性实现,该属性的属性值为一个 Drawable 对象,该 Drawable 对象将作为自定义滑块
- 由于拖动条可以被用户控制,所以需要为其添加 OnSeekBarChangeListener 监听器,基本代码如下:
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//要执行的代码
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//要执行的代码
}
@Override
//参数progress表示当前进度,也就是拖动条的值
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
//其他要执行的代码
}
});
例子
模拟调节屏幕亮度的拖动条
使用拖动条设置屏幕亮度前,需要将手机自动调节屏幕亮度的功能关闭。还需要添加如下权限(会出现红色波浪线,但不影响使用)
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
创建 BrightnessUtils .java类
public class BrightnessUtils {
/**
* 作用:用于获取当前屏幕亮度
* 返回:返回当前屏幕亮度值
*/
public static int getScreenBrightness(Context context) {
int nowBrightnessValue = 0;
//创建内容解析对象
ContentResolver resolver = context.getContentResolver();
try {
//获取当前屏幕亮度
nowBrightnessValue = Settings.System.getInt(resolver,
Settings.System.SCREEN_BRIGHTNESS);
}
catch (Exception e) {
e.printStackTrace();
}
return nowBrightnessValue;
}
/**
* 作用:用于设置系统屏幕亮度
*/
public static void setSystemBrightness(Context context, int brightness) {
//异常处理
if (brightness < 1) {
brightness = 1;
}
//异常处理
if (brightness > 255) {
brightness = 255;
}
saveBrightness(context, brightness); //调用保存屏幕亮度的方法
}
/**
* 作用:用于保存亮度设置状态
*/
public static void saveBrightness(Context context, int brightness) {
//获取设置系统屏幕亮度的uri
Uri uri = Settings.System.getUriFor("screen_brightness");
//保存修改后的屏幕亮度值
Settings.System.putInt(context.getContentResolver(),
"screen_brightness", brightness);
//更新亮度值
context.getContentResolver().notifyChange(uri, null);
}
}
编写布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="vertical"
tools:context=".bar.SeekBarActivity">
<!--thumb能设置滑动时的图标,max设置拖动数值绝对值-->
<SeekBar
android:id="@+id/my_seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_seek_bar_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="0"/>
</LinearLayout>
编写SeekBarActivity
public class SeekBarActivity extends AppCompatActivity {
private SeekBar mySeekBar; //拖动条
private TextView tvSeekBarValue; //显示拖动条的值
private BrightnessUtils utils; //屏幕亮度工具类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seek_bar);
tvSeekBarValue = (TextView) findViewById(R.id.tv_seek_bar_value);
utils =new BrightnessUtils();
mySeekBar=(SeekBar)findViewById(R.id.my_seek_bar);
//获取当前屏幕亮度并同步拖动条
mySeekBar.setProgress(utils.getScreenBrightness(this));
mySeekBar.setMax(225); //设置拖动条的最大值为225
//判断当前系统的版本是否大于或等于 6.0,符合条件将跳转开启系统设置权限的界面
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//判断系统权限设置
if (!Settings.System.canWrite(this)) {
//跳转系统权限界面
Intent intent = new Intent
(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
mySeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//当seekbar发生改动的时候就会回到这个监听器,回调这个方法
//int类型的数据需要转化为String类型 (int resid)
//progress这里的负数能设置拖动的起始值
tvSeekBarValue.setText(String.valueOf(progress));
//将当前的进度条的值传给系统
utils.setSystemBrightness(SeekBarActivity.this,progress);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
}
效果
GIF图看不出来亮度发生了变化