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

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 = ServiceManage

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值