进度条类组件SeekBar

介绍

        拖动条与进度条类似,所不同的是,拖动条允许用户拖动滑块来改变值,通常用于实现对某种数值的调节。

基本语法:

<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图看不出来亮度发生了变化

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值