在安卓下拉状态栏的亮度进度条旁加一个自动亮度调节的开关

您所在的位置:网站首页 亮度调节按钮 在安卓下拉状态栏的亮度进度条旁加一个自动亮度调节的开关

在安卓下拉状态栏的亮度进度条旁加一个自动亮度调节的开关

2024-01-13 08:15| 来源: 网络整理| 查看: 265

安卓的原生的SystemUI中下拉状态栏有一个亮度控制条,这个控制条可以控制手机的显示亮度,但是默认这里是没有自动亮度控制的开关的,本篇文章教大家如何在状态栏中添加一个自动亮度调节的开关,废话不多说,进入正题

首先我们来看一下下拉状态栏亮度进度条的位置,进度条的布局位于frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml 它在frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java文件中被加载,所以我们要在quick_settings_brightness_dialog.xml中加一个控制自动亮度的CheckBox,位置可根据实际情况自己摆放

frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml

我在这里给这个CheckBox加了一个background,其实就是改变了CheckBox的样式,这个不难,网上有相关介绍,具体的样式定义如下

frameworks/base/packages/SystemUI/res/drawable/ic_check_box_normal.xml frameworks/base/packages/SystemUI/res/drawable/ic_check_box_select.xml frameworks/base/packages/SystemUI/res/drawable/ic_checkbox_style.xml 接着我们来看一下引用quick_settings_brightness_dialog的地方,frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java文件我们来看一下QSPanel的构造方法 public QSPanel(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; setOrientation(VERTICAL); mBrightnessView = LayoutInflater.from(context).inflate( R.layout.quick_settings_brightness_dialog, this, false); addView(mBrightnessView); setupTileLayout(); mFooter = new QSFooter(this, context); addView(mFooter.getView()); updateResources(); mBrightnessController = new BrightnessController(getContext(), (ImageView) findViewById(R.id.brightness_icon), (ToggleSlider) findViewById(R.id.brightness_slider)); } 这里我们可以看到通过LayoutInflater.from方法获取到了亮度进度条的View,然后添加到了QSPanel,QSPanel就是我们下拉状态栏看到的快捷设置面板,接下来我们可以看到创建了一个BrightnessController对象,对象的构造传入了(ImageView)findViewById(R.id.brightness_icon)和(ToggleSlider) findViewById(R.id.brightness_slider)这两个 控件对象,从这个对象的命名其实就可以看出来,亮度控制者,状态栏上亮度调节具体逻辑的实现全部是在这个类里面实现的,OK,我们可以在这里将CheckBox对象也传到这个类里面,代码如下 public QSPanel(Context context, AttributeSet attrs) { super(context, attrs); ........... ........... mBrightnessController = new BrightnessController(getContext(), (ImageView) findViewById(R.id.brightness_icon), (ToggleSlider) findViewById(R.id.brightness_slider)); mBrightnessController.setCheckBox((CheckBox)findViewById(R.id.brightness_check)); }上述步骤完成后,我们就可以在BrightnessController这个类里面来具体实现自动亮度控制的逻辑 frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE; import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL; public void setCheckBox(CheckBox checkBox){ mCheckBox = checkBox; mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton arg0, boolean arg1) { // TODO Auto-generated method stub if (arg1) { Settings.System.putInt(mContext.getContentResolver(), SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_AUTOMATIC); } else { Settings.System.putInt(mContext.getContentResolver(), SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL); } Intent intent = new Intent(); intent.setAction("com.android.autobrightness"); mContext.sendBroadcast(intent); } }); } 通过改变SCREEN_BRIGHTNESS_MODE的值,便可以控制打开关闭自动亮度调节,此方法是我从Settings代码中找到的,亲试有效,这里发送了个广播是为了刷新设置的自动调节亮度界面显示问题,不用深究,这里还有一个问题,就是自动亮度调节的默认,或者在设置中改变了自动亮度调节按钮,怎么来刷新我们的CheckBox的显示,很好解决,BrightnessController这个类里面其实已经有了这个方法,叫做updateIcon方法,我们在这个类里可以直接设置CheckBox的显示 private void updateIcon(boolean automatic) { if (mIcon != null) { mIcon.setImageResource(automatic && SHOW_AUTOMATIC_ICON ? com.android.systemui.R.drawable.ic_qs_brightness_auto_on : com.android.systemui.R.drawable.ic_qs_brightness_auto_off); } if (mCheckBox != null) { mCheckBox.setChecked(automatic); } } 这里还有最后一个要解决的问题,点击设置-显示-亮度,这里会弹出一个亮度控制条dialog,这个dialog其实也是quick_settings_brightness_dialog,所以我们需要把这个dialog中的CheckBox也传给BrightnessController,具体实现如下 frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ........... final ImageView icon = (ImageView) findViewById(R.id.brightness_icon); final ToggleSlider slider = (ToggleSlider) findViewById(R.id.brightness_slider); mBrightnessController = new BrightnessController(this, icon, slider); CheckBox checkBox = (CheckBox) findViewById(R.id.brightness_check); mBrightnessController.setCheckBox(checkBox); } OK,以上就是在状态栏添加自动亮度调节开关的全部过程,按照如上方法,就可以实现全部功能,可能需要注意的就是layout布局的调节,这方面需要大家自己来调整,大家看了文章,觉得不错就点个赞吧


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3