From 23e9c05a68c06a29f47c4f6b448bf68081e041b6 Mon Sep 17 00:00:00 2001 From: cjyyy <1627814505@qq.com> Date: Sun, 9 Jul 2023 22:39:10 +0800 Subject: [PATCH] create README.md --- .idea/vcs.xml | 6 + LICENSE | 21 ++ README.md | 72 +++++++ .../\347\254\224\350\256\260.md" | 85 ++++++++ .../\350\257\264\346\230\216.md" | 187 ++++++++++++++++++ 5 files changed, 371 insertions(+) create mode 100644 .idea/vcs.xml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 "\345\205\266\345\256\203/\347\254\224\350\256\260.md" create mode 100644 "\345\205\266\345\256\203/\350\257\264\346\230\216.md" diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e55226a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 cjyyy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b0648e0 --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# 屏幕滤镜(类DC) + +## 应用简介 + +对于 OLED 屏幕的手机,一般情况下,屏幕亮度越低,频闪越强。本应用控制屏幕具有较高的亮度,并通过给屏幕添加一层不透明度可调的黑色滤镜来调节实际亮度,从而实现低亮度下也有低频闪的效果。同时,当环境光照较高时,应用会自动关闭屏幕滤镜并打开系统自动亮度,从而使屏幕能够达到最大激发亮度。 + +本应用在开发时没有考虑兼容性,目前只能保证在我的手机上正常运行。我的手机系统是 MIUI14. + +本应用参考了开源项目 https://www.coolapk.com/apk/com.omarea.filter + +## 软件使用逻辑 + +### 主界面 + +打开软件,打开准备界面(提示提供相应权限) + +软件主界面,有 + +- 屏幕滤镜开关(支持状态栏快捷设置) +- 智能亮度开关(支持状态栏快捷设置)(关闭系统自动亮度,自己实现智能亮度) +- 屏幕亮度设置拖动条(与系统状态栏亮度条同步) +- 最低硬件亮度拖动条(最低硬件亮度应设置为手机屏幕关闭类 DC 调光的阈值) +- 最高滤镜不透明度拖动条,可以调整夜间全黑环境下最舒适的屏幕亮度 +- 高光照阈值拖动条(光照达到阈值,打开系统自动亮度,使屏幕能够达到最大激发亮度) +- 亮度-光照曲线设置界面开关 + +### 光照控制亮度逻辑 + +通过亮度-光照曲线来实现。点击主界面的亮度-光照曲线设置按钮,打开亮度-光照曲线设置界面。可以通过增减修改光照-亮度对应点来调整亮度-光照曲线。 + +智能亮度逻辑通过有限状态机实现。有光照平稳、光照突增、光照突减、超高光照、用户调整这几种状态。 + +光照平稳、光照突增、光照突减:根据亮度-光照曲线设置屏幕亮度 #TODO + +高光照:打开系统自动亮度,使屏幕达到最大激发亮度 + +用户调整:在用户锁屏之前,或一定时间内,以用户调整的亮度为准 #TODO + + +## 项目依赖 + +androidplot 库, https://github.com/halfhp/androidplot + +可以直接用 Android Studio 打开项目。开发时使用的是 2022.2.1 版。 + +## 项目架构 + +### GlobalStatus + +使项目各模块解耦合。当一个模块要调用另一个模块的方法时,必须通过 GlobalStatus。 + +### UI + +与应用 UI 有关的模块位于 ui 文件夹下。 + +### FilterViewManager + +应用的核心模块,负责管理屏幕滤镜。 + +### AppAccessibilityService + +无障碍服务,用户启用无障碍功能时被创建 + +### BrightnessManager + +实现光照控制亮度逻辑 + +光照-亮度对应点 (光照强度{[0,+inf] lux}, 屏幕亮度{[0,1]}) + +### QuickSetting + +与状态栏磁贴服务有关的模块位于 quicksetting 文件夹下 \ No newline at end of file diff --git "a/\345\205\266\345\256\203/\347\254\224\350\256\260.md" "b/\345\205\266\345\256\203/\347\254\224\350\256\260.md" new file mode 100644 index 0000000..867f3a9 --- /dev/null +++ "b/\345\205\266\345\256\203/\347\254\224\350\256\260.md" @@ -0,0 +1,85 @@ +## 光线传感器 + +https://blog.csdn.net/hello_1995/article/details/119890052 + +监听器 + +```java +private class MySensorEventListener implements SensorEventListener { + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + Log.d("myLog", "onAccuracyChanged:" + sensor.getType() + "->" + accuracy); + } + + @Override + public void onSensorChanged(SensorEvent sensorEvent) { + if (sensorEvent.sensor.getType() == Sensor.TYPE_LIGHT){ + String msg = "lux: "+ sensorEvent.values[0]; + Log.d("myLog", msg); + } + } +} +``` + +进行监听 + +```java +this.mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); +this.mMySensorEventListener = new MySensorEventListener(); + +if (mSensorManager != null){ + Sensor lightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + if (lightSensor != null) { + mSensorManager.registerListener(mMySensorEventListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); + } +} +``` + +注销传感器的监听器 + +```java +@Override +protected void onPause() { + super.onPause(); + if (mSensorManager != null) { + mSensorManager.unregisterListener(mMySensorEventListener); + } +} +``` + +## 获取系统亮度 + +```java +/** + * 获取系统亮度, 屏幕亮度值范围(0-255) + */ +private int getScreenBrightness(Context context) { + ContentResolver contentResolver = context.getContentResolver(); + int defVal = 125; + return Settings.System.getInt(contentResolver, + Settings.System.SCREEN_BRIGHTNESS, defVal); +} +``` + +调用时 + +```java +getScreenBrightness(getApplicationContext()) +``` + +## 系统亮度设置 + +https://blog.csdn.net/MLQ8087/article/details/103704891 + +```java +/** + * 修改 Setting 中屏幕亮度值 + **/ +private void ModifySettingsScreenBrightness(Context context, int birghtessValue) { + ContentResolver contentResolver = context.getContentResolver(); + Settings.System.putInt(contentResolver, + Settings.System.SCREEN_BRIGHTNESS, birghtessValue); +} +``` + diff --git "a/\345\205\266\345\256\203/\350\257\264\346\230\216.md" "b/\345\205\266\345\256\203/\350\257\264\346\230\216.md" new file mode 100644 index 0000000..6987758 --- /dev/null +++ "b/\345\205\266\345\256\203/\350\257\264\346\230\216.md" @@ -0,0 +1,187 @@ +## 依赖 + +https://github.com/halfhp/androidplot + +## 软件使用逻辑 + +### 主界面 + +打开软件,打开准备界面(提示提供相应权限)(之后操作也要权限检查,不通过则放弃操作,且打开准备页面) + +软件主界面,有 + +- 滤镜开关(支持状态栏快捷设置) +- 智能亮度开关(支持状态栏快捷设置)(关闭系统自动亮度,自己实现智能亮度) +- 最低硬件亮度拖动条(最低硬件亮度一般为手机屏幕关闭类 DC 调光的阈值) +- 最高滤镜不透明度拖动条,可以调整夜间全黑环境下最舒适的屏幕亮度 +- 高光照阈值拖动条(光照达到阈值,打开系统自动亮度,使屏幕达到最大激发亮度) +- 亮度-光照曲线设置 + +### 光照控制亮度逻辑 + +通过亮度-光照曲线来实现。点击主界面的亮度-光照曲线设置按钮,打开亮度-光照曲线设置界面。可以通过增减修改光照-亮度对应点来调整亮度-光照曲线。 + +智能亮度逻辑通过有限状态机实现。有光照平稳、光照突增、光照突减、超高光照、用户调整这几种状态。 + +光照平稳、光照突增、光照突减:根据亮度-光照曲线设置屏幕亮度 + +高光照:打开系统自动亮度,使屏幕达到最大激发亮度 + +用户调整:在用户锁屏之前,或一定时间内,以用户调整的亮度为准 + + + +### 状态栏控制 + +状态栏快速设置服务,有屏幕滤镜开关、智能亮度开关、正常截图功能 + +软件正常运行时,应关闭系统自动亮度。 + +用户调整状态栏亮度调,会改变系统亮度,可以据此设置屏幕亮度。 + + +## 项目架构、伪代码 + +### MainActivity, MainUI + +主界面 + +#### 启动时 + +检查权限,打开准备界面 + +读取存储的应用设置或默认设置,保存到 `GlobalStatus` (应用存储变量,`BrightnessManager`) + +### PreparatoryActivity + +准备界面,使用户提供相应权限 + +### BrightnessPointActivity + +用来设置亮度-光照曲线 + +通过 `GlobalStatus` 修改光照-亮度对应点列表,注意零光照点和高光照阈值点必须存在 + + +### FilterViewManager + +管理屏幕滤镜 + +### FilterAccessibilityService + +无障碍服务,用户启用无障碍功能时被创建 + +#### 启动时 + +创建 `FilterViewManager`,加入到 `GlobalStatus` + +#### 运行时 + +监视光照,更新至 `GlobalStatus`,光照改变时调用 `brightnessManager.onLightChanged(float light)` + +监视系统亮度,更新至 `GlobalStatus`,用户改变系统亮度时调用 `brightnessManager.onSystemBrightnessChangedByUser(float brightness)` + +### GlobalStatus + +全局变量、方法 + +#### 应用存储变量 + +- minHardwareBrightness: 最低硬件亮度,当高于此亮度时,屏幕应为类 DC 调光 +- maxFilterOpacity: 最高滤镜不透明度 +- highLightThreshold: 高光照阈值 + + +#### float light + +当前传感器获得的光照强度,单位 lux + +#### float userBrightness + +当前用户设置的屏幕亮度,范围 [0,1] + +#### void setFilterViewManager(FilterViewManager f) + +#### void setBrightnessManager(BrightnessManager bm) + +#### boolean isAccessibility() + +判断是否具有足够的权限 + +#### void openPreparatoryActivity() + +打开准备界面 + +#### void openFilter() + +检查权限,打开滤镜 + +#### void closeFilter() + +关闭滤镜 + +#### void setAlpha(float alpha) + +调用 `FilterViewManager` 设置滤镜不透明度 + +`alpha` 取值 [0,1], 0 表示完全透明,1 表示完全不透明 + + + +#### void openIntelligentBrightness() + +检查权限,打开智能亮度 + +#### void closeIntelligentBrightness() + +关闭智能亮度 + +#### list getBrightnessPointList() + +返回光照-亮度对应点列表 + +#### void addBrightnessPoint(float light, float brightness) + +添加光照-亮度对应点,同时更新应用存储 + +#### void delBrightnessPoint(int id) + +删除光照-亮度对应点,同时更新应用存储 + +#### void setBrightnessPoint(int id, float light, float brightness) + +设置光照-亮度对应点,同时更新应用存储 + +#### void onLightChanged(float light) + +当传感器获取的光照强度改变时被调用,`light` 单位为 lux + +当智能亮度开时,根据光照,计算得相应亮度,计算得相应系统亮度并设置,计算得相应滤镜不透明度并设置 + +#### void onSystemBrightnessChangedByUser(float brightness) + +用户改变系统亮度时被调用 + +brightness 范围 [0,1] + +### BrightnessManager + +实现光照控制亮度逻辑 + +光照-亮度对应点 (光照强度{[0,+inf] lux}, 屏幕亮度{[0,1]}) + +### QuickSettingFilter + +状态栏快速设置服务,开关屏幕滤镜 + +### QuickSettingScreenShot + +状态栏快速设置服务,关闭屏幕滤镜,调用屏幕截图功能,再打开屏幕截图 + +### QuickSettingIntelligentBrightness + +状态栏快速设置服务,开关智能亮度 \ No newline at end of file