当前位置:   article > 正文

android_brightness_resolving_android brightnesssliderview

android brightnesssliderview

浅析Brightness的创建和执行流程:

步凑一 系统中packages\apps\Settings\res\xml\display_settings.xml中有添加preference组件:

  1. <com.android.settings.BrightnessPreference
  2. android:title="@string/brightness"
  3. android:persistent="false"/>
//在自定义BrightnessPreference.java中只发送了一条广播:

  1. public class BrightnessPreference extends Preference {
  2. public BrightnessPreference(Context context, AttributeSet attrs) {
  3. super(context, attrs);
  4. }
  5. @Override
  6. protected void onClick() {
  7. //发送了一个显示亮度调节对话框的广播
  8. Intent intent = new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG);
  9. getContext().sendBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF); }}

 

步凑二 接收广播并且显示BrightnessDialog菜单的消息是在framework中接收处理的:

  1. public class SettingsUI extends SystemUI {
  2. private static final String TAG = "SettingsUI";
  3. private static final boolean DEBUG = false;
  4. private final Handler mHandler = new Handler();
  5. private BrightnessDialog mBrightnessDialog;
  6. private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
  7. @Override
  8. public void onReceive(Context context, Intent intent) {
  9. String action = intent.getAction();
  10. if (action.equals(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG)) {
  11. if (DEBUG) Log.d(TAG, "showing brightness dialog");
  12. if (mBrightnessDialog == null) {
  13. //创建BrightnessDialog实例
  14. mBrightnessDialog = new BrightnessDialog(mContext);
  15. mBrightnessDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
  16. @Override
  17. public void onDismiss(DialogInterface dialog) {
  18. mBrightnessDialog = null;
  19. }
  20. });
  21. }
  22. if (!mBrightnessDialog.isShowing()) {
  23. //显示brightnessDialog
  24. mBrightnessDialog.show();
  25. }
  26. } else {
  27. Log.w(TAG, "unknown intent: " + intent);
  28. }
  29. }
  30. };
  31. public void start() {
  32. //监听ACTION_SHOW_BRIGHTNESS_DIALOG的广播
  33. IntentFilter filter = new IntentFilter();
  34. filter.addAction(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG);
  35. mContext.registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter, null, mHandler);
  36. }

步凑三 创建seekbar布局定义的结构层次是:

       1.BrightnessDialog.java
       2.BrightnessDialog.java中创建了quick_settings_brightness_dialog
       3.quick_settings_brightness_dialog中自定义了控件com.android.systemui.settings.ToggleSlider
       4.ToggleSlider.java中真正创建了seekbar控件。
       如下是:BrightnessDialog.java

  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. Window window = getWindow();
  5. window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
  6. window.getAttributes().privateFlags |=
  7. WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
  8. window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
  9. window.requestFeature(Window.FEATURE_NO_TITLE);
  10. /*SPRD bug 636829:Don't auto dismiss brightness dialog*/
  11. window.setGravity(Gravity.CENTER_VERTICAL);
  12. setContentView(R.layout.quick_settings_brightness_dialog);
  13. setCanceledOnTouchOutside(true);
  14. }

       如下是quick_settings_brightness_dialog布局文件:

  1. <TextView
  2. android:id="@+id/tab_switch_container_display"
  3. android:layout_centerVertical="true"
  4. android:layout_gravity="center_horizontal"
  5. android:layout_width="wrap_content"
  6. android:layout_height="wrap_content"
  7. android:textColor="#ffffffff"
  8. android:textSize="18px"
  9. android:text="@string/label_screen_brightness"/>
  10. <com.android.systemui.settings.ToggleSlider
  11. android:id="@+id/brightness_slider"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_gravity="center_vertical"
  15. android:layout_weight="1"
  16. systemui:text="@string/status_bar_settings_auto_brightness_label" />

        如下是:com.android.systemui.settings.ToggleSlider文件  

  1. public ToggleSlider(Context context, AttributeSet attrs, int defStyle) {
  2. super(context, attrs, defStyle);
  3. View.inflate(context, R.layout.status_bar_toggle_slider, this);
  4. final Resources res = context.getResources();
  5. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ToggleSlider,
  6. defStyle, 0);
  7. mToggle = (CompoundButton)findViewById(R.id.toggle);
  8. /* SPRD:Modify Bug 333649, remove brightness auto set @{ */
  9. if (fileIsExists()) {
  10. mToggle.setOnCheckedChangeListener(this);
  11. mToggle.setBackgroundDrawable(res.getDrawable(R.drawable.status_bar_toggle_button));
  12. }
  13. /* @} */
  14. mSlider = (SeekBar)findViewById(R.id.slider);
  15. mSlider.setOnSeekBarChangeListener(this);
  16. mLabel = (TextView)findViewById(R.id.label);
  17. mLabel.setVisibility(GONE);
  18. /* SPRD:Modify Bug 333649, remove brightness auto set @{ */
  19. /* SPRD: Bug 583693 PikeL Feature {@ */
  20. //if (fileIsExists()) {
  21. //mLabel.setText(a.getString(R.styleable.ToggleSlider_text));
  22. //}
  23. /* @} */
  24. a.recycle();
  25. }
    如下是:真正创建了seekbar控件

  1. <com.android.systemui.settings.ToggleSeekBar
  2. android:id="@+id/slider"
  3. android:layout_width="0dp"
  4. android:layout_height="wrap_content"
  5. android:layout_toEndOf="@id/toggle"
  6. android:layout_centerVertical="true"
  7. android:layout_alignParentStart="true"
  8. android:layout_alignParentEnd="true"
  9. android:paddingStart="20dp"
  10. android:paddingEnd="20dp"
  11. android:paddingTop="12dp"
  12. android:paddingBottom="12dp"
  13. //设置拖动进度条上的拇指图标
  14. android:thumb="@drawable/ic_brightness_thumb_customized"

步凑四 对亮度的真正调节效果是使用了BrightnessDialog.java中的BrightnessController

  1. protected void onStart() {
  2. super.onStart();
  3. mBrightnessController = new BrightnessController(getContext(),
  4. (ImageView) findViewById(R.id.brightness_icon),
  5. (ToggleSlider) findViewById(R.id.brightness_slider));
  6. dismissBrightnessDialog(mBrightnessDialogLongTimeout);
  7. mBrightnessController.addStateChangedCallback(this);

对BrightnessController中的浅析:
在上面onStart中创建了BrightnessDialog对象时构造函数中做了如下操作:

  1. public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
  2. mContext = context;
  3. mIcon = icon;
  4. mControl = control;
  5. /* SPRD: add to optimize oom for bug 295792 @{ */
  6. //接收SCREEN_BRIGHTNESS_MESSAGE_ID发送过来的消息处理:(保存亮度值的方式二种用到的方法,在下面代码中)
  7. mHandler = new Handler(){
  8. @Override
  9. public void handleMessage(Message msg) {
  10. // TODO Auto-generated method stub
  11. super.handleMessage(msg);
  12. if (msg.what == SCREEN_BRIGHTNESS_MESSAGE_ID) {
  13. //保存当前的亮度值至Settings.system系统中
  14. Settings.System.putIntForUser(mContext.getContentResolver(),
  15. Settings.System.SCREEN_BRIGHTNESS, msg.arg1,
  16. UserHandle.USER_CURRENT);
  17. }
  18. }
  19. };
  20. /* @} */
  21. mUserTracker = new CurrentUserTracker(mContext) {
  22. @Override
  23. public void onUserSwitched(int newUserId) {
  24. updateMode();
  25. updateSlider();
  26. }
  27. };
  28. //创建观察者模式监控亮屏的模式和亮度值状态,当发生改变时进行更新
  29. mBrightnessObserver = new BrightnessObserver(mHandler);
  30. mBrightnessObserver.startObserving();
  31. //获取PowerManager对象,从而获得亮度的最大值和最小亮度值
  32. PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
  33. mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
  34. mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
  35. mAutomaticAvailable = context.getResources().getBoolean(
  36. com.android.internal.R.bool.config_automatic_brightness_available);
  37. //获取IpowerManager对象
  38. mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
  39. // Update the slider and mode before attaching the listener so we don't receive the
  40. // onChanged notifications for the initial values.
  41. updateMode();
  42. updateSlider();
  43. control.setOnChangedListener(this);
  44. }

其中ToggleSlider文件中对seekbar控件进行监控事件处理的三个重写的方法:

  1. //拖动中
  2. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  3. if (mListener != null) {
  4. mListener.onChanged(this, mTracking, mToggle.isChecked(), progress);
  5. }
  6. }
  7. //开始拖动
  8. public void onStartTrackingTouch(SeekBar seekBar) {
  9. mTracking = true;
  10. if (mListener != null) {
  11. mListener.onChanged(this, mTracking, mToggle.isChecked(), mSlider.getProgress());
  12. }
  13. mToggle.setChecked(false);
  14. }
  15. //停止拖动
  16. public void onStopTrackingTouch(SeekBar seekBar) {
  17. mTracking = false;
  18. if (mListener != null) {
  19. mListener.onChanged(this, mTracking, mToggle.isChecked(), mSlider.getProgress());
  20. }
  21. }


在BrightnessController.java中实际处理了如下信息:
  1. public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) {
  2. //设置亮度的设置模式,mode=0表示为手动,mode=1表示自动调节
  3. setMode(automatic ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
  4. : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
  5. updateIcon(automatic);
  6. if (!automatic) {
  7. final int val = value + mMinimumBacklight;
  8. //设置屏幕的亮度
  9. setBrightness(val);
  10. // SPRD: fixbug364442 add log for brightness control.
  11. Log.d(TAG, "onChanged : value =" + value + " , mMinimumBacklight =" +
  12. mMinimumBacklight + " , tracking =" + tracking);
  13. //以下的设置是将屏幕的亮度值保存到settings/system中的两种方式
  14. //方式一:直接putIntForUser
  15. if (!tracking) {
  16. /* SPRD: add to optimize oom for bug 295792 @{
  17. * @origin: we move it to handlemessage beicause there are too many runnables
  18. * AsyncTask.execute(new Runnable() {
  19. * public void run() {
  20. * Settings.System.putIntForUser(mContext.getContentResolver(),
  21. * Settings.System.SCREEN_BRIGHTNESS, val,
  22. * UserHandle.USER_CURRENT);
  23. * }
  24. * });
  25. */
  26. //方式二:通过handle 发送一个SCREEN_BRIGHTNESS_MESSAGE_ID消息给到接收方处理保存亮度。
  27. mHandler.removeMessages(SCREEN_BRIGHTNESS_MESSAGE_ID);
  28. //发送SCREEN_BRIGHTNESS_MESSAGE_ID消息
  29. mHandler.obtainMessage(SCREEN_BRIGHTNESS_MESSAGE_ID, val, -1).sendToTarget();
  30. /* @} */
  31. }
  32. }
  33. for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
  34. cb.onBrightnessLevelChanged();
  35. }
  36. }
附加:设置屏亮度
  1. private void setBrightness(int brightness) {
  2. try {
  3. mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
  4. } catch (RemoteException ex) {
  5. }
  6. }
设置亮屏模式:

  1. private void setMode(int mode) {
  2. Settings.System.putIntForUser(mContext.getContentResolver(),
  3. Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
  4. mUserTracker.getCurrentUserId());
  5. }

时间关系,只能仓促的这样结束了,条理不怎么清晰,看不懂莫怪,还有可能误导大家,写这个就是希望有人能指正我的错误,仅供参考吧!








声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/314839
推荐阅读
相关标签
  

闽ICP备14008679号