android 屏幕亮度调节方法详解

android 屏幕亮度调节方法详解,第1张

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

屏幕亮度自动调节:
主要是从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);
                }
。。。。。
   }

您可能感兴趣的文章:Android调节屏幕亮度实现代码android 如何设置开机后屏幕亮度默认值为自动调节Android编程调节屏幕亮度(背景灯)及保持背景灯常亮的方法Android中 视频屏幕左半部分上下滑动改变亮度右半部分上下滑动改变声音Android视频播放器屏幕左侧边随手指上下滑动亮度调节功能的原理实现Android编程设置屏幕亮度的方法Android开发实现调节屏幕亮度功能 总结

以上是内存溢出为你收集整理的android 屏幕亮度调节方法详解全部内容,希望文章能够帮你解决android 屏幕亮度调节方法详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1142955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存