android 颜色管理 WCG,Android Q 色彩(颜色)模式解析(一)

编程入门 行业动态 更新时间:2024-10-28 12:18:25

android <a href=https://www.elefans.com/category/jswz/34/1771046.html style=颜色管理 WCG,Android Q 色彩(颜色)模式解析(一)"/>

android 颜色管理 WCG,Android Q 色彩(颜色)模式解析(一)

[TOC]

Android 色彩(颜色)模式解析(一)

Android Q 在系统设置中提供了可设置的色彩模式,当然这功能很多厂商早就有了~,落后归落后,我们还是看看Android是怎么实现的!

Android Q提供了4种色彩模式:

Natural 自然色

Boosted 效果增强

Saturated 饱和色

Adaptive 自动调节

下面我们就结合实际代码,看看具体的实现和流程!

FrameWork色彩模式的定义及实现

为了实现色彩模式的切换,Android Framework设计了ColorDisplayManager及对应的服务,提供可切换的色彩模式和对应的设置接口。四种色彩模式对应的值如下:

public static final int COLOR_MODE_NATURAL = 0;

public static final int COLOR_MODE_BOOSTED = 1;

public static final int COLOR_MODE_SATURATED = 2;

public static final int COLOR_MODE_AUTOMATIC = 3;

Settings中通过ColorDisplayManager的setColorMode接口进行色彩模式的切换,对应的代码如下:

* packages/apps/Settings/src/com/android/settings/display/ColorModePreferenceFragment.java

@Override

protected boolean setDefaultKey(String key) {

switch (key) {

case KEY_COLOR_MODE_NATURAL:

mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);

break;

case KEY_COLOR_MODE_BOOSTED:

mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED);

break;

case KEY_COLOR_MODE_SATURATED:

mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_SATURATED);

break;

case KEY_COLOR_MODE_AUTOMATIC:

mColorDisplayManager.setColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC);

break;

}

return true;

}

在ColorDisplayManager中,设计了一个内部类ColorDisplayManagerInternal,通过内部类和对应的系统服务COLOR_DISPLAY_SERVICE进行交互。

* frameworks/base/core/java/android/hardware/display/ColorDisplayManager.java

public void setColorMode(int colorMode) {

mManager.setColorMode(colorMode);

}

对应的服务实现如下:

* frameworks/base/services/core/java/com/android/server/display/color/ColorDisplayService.java

private void setColorModeInternal(@ColorMode int colorMode) {

if (!isColorModeAvailable(colorMode)) {

throw new IllegalArgumentException("Invalid colorMode: " + colorMode);

}

System.putIntForUser(getContext().getContentResolver(), System.DISPLAY_COLOR_MODE,

colorMode,

mCurrentUser);

}

在色彩显示服务中,只是将需要的色彩模式对应的值写到了,系统设置的数据库中,键值DISPLAY_COLOR_MODE。

其实,看多了Framework的代码,我们就会知道,肯定会有一个ContentObserver来监听这个数据的变化的,在ColorDisplayService的setUp函数中:

private void setUp() {

Slog.d(TAG, "setUp: currentUser=" + mCurrentUser);

// Listen for external changes to any of the settings.

if (mContentObserver == null) {

mContentObserver = new ContentObserver(new Handler(DisplayThread.get().getLooper())) {

@Override

public void onChange(boolean selfChange, Uri uri) {

super.onChange(selfChange, uri);

final String setting = uri == null ? null : uri.getLastPathSegment();

if (setting != null) {

switch (setting) {

... ...

case System.DISPLAY_COLOR_MODE:

onDisplayColorModeChanged(getColorModeInternal());

当设置中,切换色彩模式,修改了系统设置中的DISPLAY_COLOR_MODE值后,这个observer就会触发DISPLAY_COLOR_MODE的onChange,最后通过onDisplayColorModeChanged函数来处理。

* frameworks/base/services/core/java/com/android/server/display/color/ColorDisplayService.java

private void onDisplayColorModeChanged(int mode) {

if (mode == NOT_SET) {

return;

}

mNightDisplayTintController.cancelAnimator();

mDisplayWhiteBalanceTintController.cancelAnimator();

if (mNightDisplayTintController.isAvailable(getContext())) {

mNightDisplayTintController

.setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix(mode));

mNightDisplayTintController

.setMatrix(mNightDisplayTintController.getColorTemperatureSetting());

}

updateDisplayWhiteBalanceStatus();

final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);

dtm.setColorMode(mode, mNightDisplayTintController.getMatrix());

}

这里涉及到夜光屏和白平衡,说白了,这些的实现都是跟色彩和亮度有关。我们先留下夜光屏幕和白平衡,单看色彩模式的流程。色彩模式,通过 DisplayTransformManager 的setColorMode接口继续往下传:

* frameworks/base/services/core/java/com/android/server/display/color/DisplayTransformManager.java

public boolean setColorMode(int colorMode, float[] nightDisplayMatrix) {

if (colorMode == ColorDisplayManager.COLOR_MODE_NATURAL) {

applySaturation(COLOR_SATURATION_NATURAL);

setDisplayColor(DISPLAY_COLOR_MANAGED);

} else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) {

applySaturation(COLOR_SATURATION_BOOSTED);

setDisplayColor(DISPLAY_COLOR_MANAGED);

} else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) {

applySaturation(COLOR_SATURATION_NATURAL);

setDisplayColor(DISPLAY_COLOR_UNMANAGED);

} else if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) {

applySaturation(COLOR_SATURATION_NATURAL);

setDisplayColor(DISPLAY_COLOR_ENHANCED);

}

setColorMatrix(LEVEL_COLOR_MATRIX_NIGHT_DISPLAY, nightDisplayMatrix);

updateConfiguration();

return true;

}

重点来了,前面我们说到的4种色彩模式,主要通过两个参数的调节来实现的

Saturation饱和度

饱和度两种可选模式:自然模式和增强模式

private static final float COLOR_SATURATION_NATURAL = 1.0f;

private static final float COLOR_SATURATION_BOOSTED = 1.1f;

DisplayColor显示颜色

显示颜色有3种模式:Managed,UnManaged以及增强模式

private static final int DISPLAY_COLOR_MANAGED = 0;

private static final int DISPLAY_COLOR_UNMANAGED = 1;

private static final int DISPLAY_COLOR_ENHANCED = 2;

我们的4中色彩模式:

**

COLOR_SATURATION_NATURAL

COLOR_SATURATION_BOOSTED

DISPLAY_COLOR_MANAGED

自然色 COLOR_MODE_NATURAL

效果增强 COLOR_MODE_BOOSTED

DISPLAY_COLOR_UNMANAGED

饱和色 COLOR_MODE_SATURATED

DISPLAY_COLOR_ENHANCED

自动调节 COLOR_MODE_AUTOMATIC

这两个参数的设置是通过binder直接设置到SurfaceFlinger的,对应的Binder 命令分别为SURFACE_FLINGER_TRANSACTION_SATURATION和 SURFACE_FLINGER_TRANSACTION_DISPLAY_COLOR。相应的代码如下:

饱和度的设置通过applySaturation函数

* frameworks/base/services/core/java/com/android/server/display/color/DisplayTransformManager.java

private void applySaturation(float saturation) {

SystemProperties.set(PERSISTENT_PROPERTY_SATURATION, Float.toString(saturation));

final IBinder flinger = ServiceManag

更多推荐

android 颜色管理 WCG,Android Q 色彩(颜色)模式解析(一)

本文发布于:2024-03-12 08:34:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1731114.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:颜色   色彩   模式   android   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!