android 屏幕亮度调节方法详解

屏幕亮度自动调节:
主要是从Sensor分析之中分离出来分析LIGHT 光线感应器,因此就分析一下自动调节屏幕亮度(手机随着光线的强度自我调节,也就是在亮的光线下屏幕自动调亮一些,暗的时候就自动调暗一些,省得光线对眼睛有刺激).....

(本人从历经挫折才大概了解流程),现在就开始讲一下流程,如果有不对地方希望牛人指出来。。。

先从Sttings入手吧,在diaplay中有屏幕亮度调节,有一个进度调,上面有一个checkbox(自动调节屏幕亮度的),

那么我们当然去找settings下的文件开始看了,先找到
DiaplaySettings.java文件以及display_setting.xml文件,display_setting.xml里面能找到相应的组件,但是 在DiaplaySettings.java文件中却不能找到调用相应组件的代码,

那么我们再到settings中去找,能找到BrightnessPreference.java文件,没错这个文件就是自动调节亮度的文件,我们先看看代码:
构造函数中有mAutomaticAvailable = context.getResources().getBoolean(com.android.internal.R.bool.config_automatic_brightness_available);
开始以为mAutomaticAvailabl的值(为true,在config.xml中)是判断是否自动调节亮度,因为在我跟进到PowerManagerService.java中,在initInThread() 中
  mUseSoftwareAutoBrightness = resources.getBoolean(
                com.android.internal.R.bool.config_automatic_brightness_available);

if (mUseSoftwareAutoBrightness) {
            mAutoBrightnessLevels = resources.getIntArray(
                    com.android.internal.R.array.config_autoBrightnessLevels);//得到自动化调节的值调用 getAutoBrightnessValue(int sensorValue, int[] values) 方法
            mLcdBacklightValues = resources.getIntArray(
                    com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);
            mButtonBacklightValues = resources.getIntArray(
                    com.android.internal.R.array.config_autoBrightnessButtonBacklightValues);
            mKeyboardBacklightValues = resources.getIntArray(。。。。。
。。。。。。这里看起来好像是当mUseSoftwareAutoBrightness为true时就取得config.xml文件config_autoBrightnessLevels的值,再去根据光线自动调节,但是mAutomaticAvailabl的值只是说明有没有自动调节屏幕的功能(比如说你将config.xml文件的config_automatic_brightness_available的值改为false,编译替换framework-res.apk那么在屏幕亮度调节中将没有自动调节的checkbox),这也能解释构造函数一开始就初始化mAutomaticAvailabl的值。

接下来在BrightnessPreference.java文件中有onProgressChanged,onStartTrackingTouch(SeekBar seekBar),onStopTrackingTouch(SeekBar seekBar)方法,这些一看也能懂就不介绍了,在onBindDialogView(View view)方法中有
mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode);
        if (mAutomaticAvailable) {//当有自动调节功能
            mCheckBox.setOnCheckedChangeListener(this);//为checkbox添加监听事件
            try {
                mOldAutomatic = Settings.System.getInt(getContext().getContentResolver(),
                        Settings.System.SCREEN_BRIGHTNESS_MODE);
。。。。。。
主要看public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
                : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
        if (!isChecked) {
            setBrightness(mSeekBar.getProgress() + MINIMUM_BACKLIGHT);
        }
    }
这里才是你选择自动调节亮度的checkbox,如果选择则setMode(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);并将数据存放到数据库中。

这里是重点:这里有个数据库,当监测到数据库中的值发生改变时也就是变为Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC时,就会跳到
powerManagerService.java的initInThread()中ContentResolver resolver = mContext.getContentResolver();
        Cursor settingsCursor = resolver.query(Settings.System.CONTENT_URI, null,
                "(" + Settings.System.NAME + "=?) or ("
                        + Settings.System.NAME + "=?) or ("
                        + Settings.System.NAME + "=?) or ("
                        + Settings.System.NAME + "=?) or ("
                        + Settings.System.NAME + "=?) or ("
                        + Settings.System.NAME + "=?) or ("
                        + Settings.System.NAME + "=?)",
                new String[]{STAY_ON_WHILE_PLUGGED_IN, SCREEN_OFF_TIMEOUT, DIM_SCREEN, XEC_DLS_CONTROL,
                        SCREEN_BRIGHTNESS_MODE, WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE},
                null);
        mSettings = new ContentQueryMap(settingsCursor, Settings.System.NAME, true, mHandler);
        SettingsObserver settingsObserver = new SettingsObserver();
        mSettings.addObserver(settingsObserver);
数据库中数据发生改变时触发事件的发生。

在 powerManagerService.java的systemReady()(只在开机调用一次就不再调用)中
 if (mUseSoftwareAutoBrightness) {
            Log.i("frist","frist="+"aaaa");
            mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
            enableLightSensor(true);
        }
而mUseSoftwareAutoBrightness是在initInThread()线程中取得了true值,那么就到enableLightSensor(true);方法去看
 if (enable) {
                    mSensorManager.registerListener(mLightListener, mLightSensor,
                            SensorManager.SENSOR_DELAY_NORMAL);
                }
如果传递来的值为true也就是enable=true就监听而且用匹配屏幕方向变化的感应SENSOR_DELAY_NORMAL。
再看mLightListener事件:SensorEventListener mLightListener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent event) {
            synchronized (mLocks) {
                int value = (int)event.values[0];//从event里面获取当前数据
                Log.i("value","value="+value);       
                long milliseconds = SystemClock.elapsedRealtime();
                if (mDebugLightSensor) {
                    Slog.d(TAG, "onSensorChanged: light value: " + value);
                }
                mHandler.removeCallbacks(mAutoBrightnessTask);
                if (mLightSensorValue != value) {//mLightSensorValue是当前的屏幕亮度
                    if (mLightSensorValue == -1 ||
                            milliseconds < mLastScreenOnTime + mLightSensorWarmupTime) {
                        // process the value immediately if screen has just turned on
                        lightSensorChangedLocked(value);
                    } else {
                        // delay processing to debounce the sensor
                        mLightSensorPendingValue = value;//mLightSensorPendingValue是准备要设置的亮度
                        mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY);//到mAutoBrightnessTask线程去完成自动调节
                    }
                } else {
                    mLightSensorPendingValue = -1;
                }
            }
        }
当前屏幕亮度肯定不等与-1,所以做else中的mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY),那么我们再到mAutoBrightnessTask
线程看:private Runnable mAutoBrightnessTask = new Runnable() {
        public void run() {
            synchronized (mLocks) {
                int value = (int)mLightSensorPendingValue;
                Log.i("mLightSensorPendingValue","mLightSensorPendingValue"+mLightSensorPendingValue);
                if (value >= 0) {
                    mLightSensorPendingValue = -1;
                    lightSensorChangedLocked(value);
                }
            }
        }
    };就是不断的去调用lightSensorChangedLocked(value)
private void lightSensorChangedLocked(int value) {
。。。。。。。
if (mLightSensorValue != value) {
            mLightSensorValue = value;
            if ((mPowerState & BATTERY_LOW_BIT) == 0) {
                // Use light sensor value no matter it is in a dock or not.
                int lcdValue = getAutoBrightnessValue(
                        value,
                        mLcdBacklightValues);// 取得mLcdBacklightValues里面的值
                int buttonValue = getAutoBrightnessValue(value, mButtonBacklightValues);
                int keyboardValue;
                if (mKeyboardVisible) {
                    keyboardValue = getAutoBrightnessValue(value, mKeyboardBacklightValues);
                } else {
                    keyboardValue = 0;
                }
。。。
if (mAutoBrightessEnabled && mScreenBrightnessOverride < 0) {//设置屏幕亮度
                    mScreenBrightness.setTargetLocked(lcdValue, AUTOBRIGHTNESS_ANIM_STEPS,
                            INITIAL_SCREEN_BRIGHTNESS, (int)mScreenBrightness.curValue);
                }
。。。。。
   }

时间: 2024-11-27 13:59:56

android 屏幕亮度调节方法详解的相关文章

android 屏幕亮度调节方法详解_Android

屏幕亮度自动调节:主要是从Sensor分析之中分离出来分析LIGHT 光线感应器,因此就分析一下自动调节屏幕亮度(手机随着光线的强度自我调节,也就是在亮的光线下屏幕自动调亮一些,暗的时候就自动调暗一些,省得光线对眼睛有刺激).....     (本人从历经挫折才大概了解流程),现在就开始讲一下流程,如果有不对地方希望牛人指出来...     先从Sttings入手吧,在diaplay中有屏幕亮度调节,有一个进度调,上面有一个checkbox(自动调节屏幕亮度的),那么我们当然去找settings

Android 中 onSaveInstanceState()使用方法详解

Android 中 onSaveInstanceState()使用方法详解 覆盖onSaveInstanceState方法,并在onCreate中检测savedInstanceState和获取保存的值 @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("currentposition", videoView.getCurrentPosition()); super.onSave

Android Parcelable接口使用方法详解

Android Parcelable接口使用方法详解 1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing

Android StringBuffer的使用方法详解

今天,讲讲StringBuffer的使用. StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类. 所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入.删除等操作,使用StringBuffer要更加适合一些. 在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能

Android组件popupwindow使用方法详解_Android

先看效果:  现在很多的应用效果都需要做的炫些,像UC,以及天天静听,效果很炫的,源码已经对外开放了,有兴趣的可以去研究下的  上源码 main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="

电脑屏幕亮度怎么调,电脑屏幕亮度调节方法

电脑屏幕亮度怎么调,我们一起来跟随本文学习一下吧. 怎样调节笔记本屏幕亮度 如果您的电脑是笔记本一般可以通过笔记本键盘组合键实现调节,首先您要看一下键盘上的fn键和那两个亮度的标志(标志就像一个太阳,向上调亮, 向下调暗)在那位置才行,一般的手提的这两个标志均设计在F1-F12上,您认真看一下就可以找到了,然后按住fn健,如果您要调得亮一些,再按向上的标 志,如果您要调暗,就按住fn键再点按向下的标志.如下图所示: 台式电脑电脑屏幕亮度怎么调 目前我们使用的台式电脑均采用液晶显示器,在显示器底部

Android中HorizontalScrollView使用方法详解_Android

由于移动设备物理显示空间一般有限,不可能一次性的把所有要显示的内容都显示在屏幕上.所以各大平台一般会提供一些可滚动的视图来向用户展示数据.Android平台框架中为我们提供了诸如ListView.GirdView.ScrollView等滚动视图控件,这几个视图控件也是我们平常使用最多的.下面介绍一下HorizontalScrollView的使用和需要注意的点:  HorizontalScrollView是一个FrameLayout  ,这意味着你只能在它下面放置一个子控件,这个子控件可以包含很多

努比亚Z9 mini屏幕亮度调节方法

方法一:直接法 智能手机都有通知菜单,一般在这里面有许多的快捷设置,努比亚Z9 mini手机也具体此功能,我们只要下拉屏幕便可看到屏幕亮度调节图标,左右调节亮度即可,如下图所示: 方法二:间接法 1,常规方法我们进入到努比亚Z9 mini设置中点击[显示]: 2,在显示中我们会看到且项"屏幕亮度调节"当然我们也可以选中"自动调整亮度"这样努比亚Z9 mini会根据光线强度自动调节屏幕亮度.如下图所示: 总得来讲努比亚Z9 mini手机屏幕亮度的调节方法都是非常的简单

Android编程基于距离传感器控制手机屏幕熄灭的方法详解

本文实例讲述了Android编程基于距离传感器控制手机屏幕熄灭的方法.分享给大家供大家参考,具体如下: 在现实生活中,打电话的时候手机挨着自己的头,屏幕会熄灭,这是为了不让自己的头按到什么手机键~ 这个功能可以使用距离传感器来实现 P-Sensor距离感应器,可以感应手机和人体距离.具体使用用途是在通话过程中打开P-Sensor,那么当手机屏幕贴近用户脸部时,就会自动感应出手机和人体距离是多少.当小于某一个值时,就会熄灭屏幕,不再接收用户触摸屏幕事件,从而有效的防止通话过程中误触摸事件的出现.