RK Android5.1 亮度条、ContentObserver内容观察者模式
一.Setting 里面 亮度条弹窗
1.1.packages/apps/Settings/res/xml/display_settings.xml
<PreferenceScreen android:key="brightness" android:title="@string/brightness" settings:keywords="@string/keywords_display_brightness_level"> <intent android:action="android.intent.action.SHOW_BRIGHTNESS_DIALOG" /> </PreferenceScreen>
1.2.frameworks/base/packages/SystemUI/AndroidManifest.xml
<activity android:name=".settings.BrightnessDialog" android:label="@string/quick_settings_brightness_dialog_title" android:theme="@android:style/Theme.DeviceDefault.Dialog" android:finishOnCloseSystemDialogs="true" android:launchMode="singleInstance" android:excludeFromRecents="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.SHOW_BRIGHTNESS_DIALOG" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
1.3.frameworks\base\packages\SystemUI\src\com\android\systemui\settings\BrightnessDialog.java 亮度条弹框
public class BrightnessDialog extends Activity { private BrightnessController mBrightnessController; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Window window = getWindow(); window.setGravity(Gravity.TOP); window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); window.requestFeature(Window.FEATURE_NO_TITLE); //布局文件 setContentView(R.layout.quick_settings_brightness_dialog); final ImageView icon = (ImageView) findViewById(R.id.brightness_icon); //亮度条 final ToggleSlider slider = (ToggleSlider) findViewById(R.id.brightness_slider); mBrightnessController = new BrightnessController(this, icon, slider); }
1.4. 全场重点来了 BrightnessController 获取设备最大的亮度和最低的亮度值、设置屏幕的亮度、保存和获取当前的亮度值和亮度调节模式
ContentObserver 内容观察者 观察(捕捉)特定Uri引起的数据库的变化 继而做一些相应的处理
这就不用另写线程 去监听数据库的变化 更新UI
推荐的文章 Android中内容观察者的使用---- ContentObserver类详解
ContentObserver类介绍
构造方法 public void ContentObserver(Handler handler) 说明:所有 ContentObserver的派生类都需要调用该构造方法 参数: handler Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。 常用方法 void onChange(boolean selfChange) 功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。 参数:selfChange
frameworks\base\packages\SystemUI\src\com\android\systemui\settings\BrightnessController.java
ContentObserver to watch brightness 内部类 BrightnessObserver
onChange 更新亮度条
private class BrightnessObserver extends ContentObserver { private final Uri BRIGHTNESS_MODE_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE); private final Uri BRIGHTNESS_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); private final Uri BRIGHTNESS_ADJ_URI = Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ); public BrightnessObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { onChange(selfChange, null); } @Override public void onChange(boolean selfChange, Uri uri) { if (selfChange) return; try { mExternalChange = true; if (BRIGHTNESS_MODE_URI.equals(uri)) { updateMode(); updateSlider(); } else if (BRIGHTNESS_URI.equals(uri) && !mAutomatic) { updateSlider();
public BrightnessController(Context context, ImageView icon, ToggleSlider control) { mContext = context; mIcon = icon; mControl = control; mHandler = new Handler(); ……………………………………………… @Override public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) { updateIcon(mAutomatic); if (mExternalChange) return; if (!mAutomatic) { final int val = value + mMinimumBacklight; setBrightness(val); /*如果当前不是一直按着滑动块而是松手了的话就把那些数据写到数据库里面去。 注意在滑动过程中是直接调用setBrightness(),而不是通过数据库来实现的。但是松手后 才写入数据库的。 */ if (!tracking) { AsyncTask.execute(new Runnable() { public void run() { Settings.System.putIntForUser(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, val, UserHandle.USER_CURRENT); } }); } }
二.亮度调整显示“当前亮度值xxx”
2.1.Patch
diff --git a/frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml old mode 100644 new mode 100755 index a996260..8e030a1 --- a/frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml +++ b/frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml @@ -18,7 +18,12 @@ android:paddingLeft="16dp" android:paddingRight="16dp" style="@style/BrightnessDialogContainer"> - + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + <ImageView android:id="@+id/brightness_icon" android:layout_width="wrap_content" @@ -31,10 +36,36 @@ <com.android.systemui.settings.ToggleSlider android:id="@+id/brightness_slider" - android:layout_width="0dp" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_weight="1" + android:layout_gravity="center" systemui:text="@string/status_bar_settings_auto_brightness_label" /> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center"> + + <TextView + android:id="@+id/brightness_now_value" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/brightness_now_value" + android:textSize="16sp" + android:textColor="#FFFFFF" + /> + + <TextView + android:id="@+id/brightness_slider_value" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textSize="16sp" + android:textColor="#FFFFFF"/> + + </LinearLayout> + + </LinearLayout> + + </LinearLayout> diff --git a/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml b/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml index 9cc642c..a54c4d0 100755 --- a/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -437,4 +437,5 @@ <string name="power_sub_close">关闭系统</string> <string name="power_sub_sleep">系统休眠</string> <string name="power_sub_reboot">重启系统</string> + <string name="brightness_now_value">当前屏幕亮度: </string> </resources> diff --git a/frameworks/base/packages/SystemUI/res/values/strings.xml b/frameworks/base/packages/SystemUI/res/values/strings.xml index d4d7d07..90f7b12 100755 --- a/frameworks/base/packages/SystemUI/res/values/strings.xml +++ b/frameworks/base/packages/SystemUI/res/values/strings.xml @@ -1003,4 +1003,5 @@ <string name="power_sub_close">Shutdown</string> <string name="power_sub_sleep">Go to Sleep</string> <string name="power_sub_reboot">Reboot</string> + <string name="brightness_now_value">Current screen brightness: </string> </resources> diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java old mode 100644 new mode 100755 index 4dacacf..c30625d --- a/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -106,7 +106,8 @@ public class QSPanel extends ViewGroup { mBrightnessController = new BrightnessController(getContext(), (ImageView) findViewById(R.id.brightness_icon), - (ToggleSlider) findViewById(R.id.brightness_slider)); + (ToggleSlider) findViewById(R.id.brightness_slider), + (TextView) findViewById(R.id.brightness_slider_value)); mDetailDoneButton.setOnClickListener(new OnClickListener() { @Override diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java old mode 100644 new mode 100755 index 946a3d1..84cfe50 --- a/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java +++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java @@ -31,6 +31,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.widget.CompoundButton; import android.widget.ImageView; +import android.widget.TextView; import com.android.systemui.R; @@ -51,6 +52,7 @@ public class BrightnessController implements ToggleSlider.Listener { private final Context mContext; private final ImageView mIcon; + private final TextView mText_brightness; private final ToggleSlider mControl; private final boolean mAutomaticAvailable; private final IPowerManager mPower; @@ -133,10 +135,11 @@ public class BrightnessController implements ToggleSlider.Listener { } - public BrightnessController(Context context, ImageView icon, ToggleSlider control) { + public BrightnessController(Context context, ImageView icon, ToggleSlider control ,TextView text_brightness) { mContext = context; mIcon = icon; mControl = control; + mText_brightness = text_brightness; mHandler = new Handler(); mUserTracker = new CurrentUserTracker(mContext) { @Override @@ -301,6 +304,7 @@ public class BrightnessController implements ToggleSlider.Listener { UserHandle.USER_CURRENT); mControl.setMax(mMaximumBacklight - mMinimumBacklight); mControl.setValue(value - mMinimumBacklight); + mText_brightness.setText(" "+value); } } diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java old mode 100644 new mode 100755 index a1704ff..2a4a720 --- a/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java +++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java @@ -27,6 +27,7 @@ import android.view.KeyEvent; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; +import android.widget.TextView; import com.android.systemui.R; @@ -49,7 +50,8 @@ public class BrightnessDialog extends Activity { final ImageView icon = (ImageView) findViewById(R.id.brightness_icon); final ToggleSlider slider = (ToggleSlider) findViewById(R.id.brightness_slider); - mBrightnessController = new BrightnessController(this, icon, slider); + final TextView brightness_value = (TextView) findViewById(R.id.brightness_slider_value); + mBrightnessController = new BrightnessController(this, icon, slider , brightness_value); } @Override