为什么TextView textColor会自动调整到背景色调
Why is TextView textColor automatically adjusted to the background color tone
最近开始学习Android开发。制作了一个非常简单的 XML 布局,只有一个 LinearLayout
包含一些 ImageViews
和 TextViews
。我在 styles.xml 中使用的主题是
Theme.AppCompat.Light.NoActionBar
对于 TextViews,我还没有设置 textColor,但是在我的 phone 上,文本颜色会自动调整并匹配各自的背景颜色(只是更暗以获得更多对比度)。我喜欢这种效果,但我不知道它来自哪里。
这是 TextView 之一:
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:layout_gravity="center_vertical"
android:textSize="22sp"
android:textStyle="bold"
android:text="Enjoy your view!" />
这是结果(自动文本颜色以红色选择突出显示):
哪个 attribute/setting/class 或其他内置功能对此负责?它取决于phone吗?还是主题?或者...?
默认情况下 TextView
文本颜色由 Theme
决定,您像 Theme.AppCompat.Light.NoActionBar
一样应用,但您可以更改它,只需在 TextView
中添加 android:textColor="#FF0000"
] 这将改变您的文字颜色。这是一个例子。
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="TextView"
android:textSize="36sp"
android:textColor="#FF0000" />
主题驱动您的色彩和行为。
Android 将根据您的基本应用主题将默认颜色应用于您的文本。
你不应该让机会选择你的颜色、字体大小和那种性质的东西。使用您的样式来创建您的通用需求、大小、字体和颜色,并在整个过程中应用该样式。
示例:
<!--Define custom font type-->
<style name="TextAppearance.Light" parent="android:TextAppearance">
<item name="fontPath">fonts/Roboto-Light.ttf</item>
</style>
<style name="TextAppearance.Medium" parent="android:TextAppearance">
<item name="fontPath">fonts/Roboto-Medium.ttf</item>
</style>
<style name="TextAppearance.Regular" parent="android:TextAppearance">
<item name="fontPath">fonts/Roboto-Regular.ttf</item>
</style>
<!--TextView font type "Roboto-Light" style-->
<style name="MyAppTheme.TextView.Light">
<item name="android:textAppearance">@style/TextAppearance.Light</item>
</style>
<style name="MyAppTheme.TextView.Light.Small">
<item name="android:textSize">@dimen/text_size_small</item>
</style>
<style name="MyAppTheme.TextView.Light.Medium">
<item name="android:textSize">@dimen/text_size_medium</item>
</style>
<style name="MyAppTheme.TextView.Light.Large">
<item name="android:textSize">@dimen/text_size_large</item>
</style>
<style name="MyAppTheme.TextView.Light.14sp">
<item name="android:textSize">@dimen/text_size_14</item>
</style>
<style name="MyAppTheme.TextView.Light.12sp">
<item name="android:textSize">@dimen/text_size_14</item>
</style>
<!--TextView font type "Roboto-Medium" style-->
<style name="MyAppTheme.TextView.Medium">
<item name="android:textAppearance">@style/TextAppearance.Medium</item>
</style>
<style name="MyAppTheme.TextView.Medium.Small">
<item name="android:textSize">@dimen/text_size_small</item>
</style>
<style name="MyAppTheme.TextView.Medium.Medium">
<item name="android:textSize">@dimen/text_size_medium</item>
</style>
<style name="MyAppTheme.TextView.Medium.Large">
<item name="android:textSize">@dimen/text_size_large</item>
</style>
<!--TextView font type "Roboto-Regular" style-->
<style name="MyAppTheme.TextView.Regular">
<item name="android:textAppearance">@style/TextAppearance.Regular</item>
</style>
<style name="MyAppTheme.TextView.Regular.Small">
<item name="android:textSize">@dimen/text_size_small</item>
</style>
<style name="MyAppTheme.TextView.Regular.Medium">
<item name="android:textSize">@dimen/text_size_medium</item>
</style>
<style name="MyAppTheme.TextView.Regular.Large">
<item name="android:textSize">@dimen/text_size_large</item>
</style>
<style name="MyAppTheme.TextView.Regular.13sp">
<item name="android:textSize">@dimen/text_size_13</item>
</style>
//通用 TextView 主题
<!--TextView text color and single line true-->
<style name="MyAppTheme.TextView">
<item name="android:singleLine">true</item>
<item name="android:textColor">@android:color/white</item>
</style>
//现在制作与您的普通文本主题不同的主题。
那么所有的文本视图都将遵循上面的,除非你用 style="@styles/MyAppTheme.SomeOtherTextStyle"
改变布局文件本身的样式
示例:
<TextView
android:id="@+id/txtLastSavedLabel"
style="@style/MyAppTheme.TextView.Light.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/configuration_list_item_last_saved" />
Theme.AppCompat.Light
主题的默认文本颜色略微半透明,这就是为什么它看起来会针对每种不同的背景颜色进行调整。
我们可以查看源代码以确定实际值,从您选择的主题开始,该主题在 appcompat 的 themes.xml
:
中定义
<style name="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
这继承自 Theme.AppCompat.Light
同样 XML:
<style name="Theme.AppCompat.Light" parent="Base.Theme.AppCompat.Light" />
Base.Theme.AppCompat.Light
位于 themes_base.xml
:
<style name="Base.Theme.AppCompat.Light" parent="Base.V7.Theme.AppCompat.Light">
这导致我们在同一个文件中 Base.V7.Theme.AppCompat.Light
:
<style name="Base.V7.Theme.AppCompat.Light" parent="Platform.AppCompat.Light">
然后到 Platform.AppCompat.Light
,我们最终到达颜色设置:
<style name="Platform.AppCompat.Light" parent="android:Theme.Light">
...
<!-- Text colors -->
<item name="android:textColorPrimary">@color/abc_primary_text_material_light</item>
...
abc_primary_text_material_light
is actually a ColorStateList
, which is defined in XML with a <selector>
element, and its file is under appcompat's res/color/
directory:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/primary_text_disabled_material_light"/>
<item android:color="@color/primary_text_default_material_light"/>
</selector>
最后,我们找到默认颜色 - primary_text_default_material_light
- 这是在 res/values/colors_material.xml
:
中定义的简单颜色值
<!-- 87% black -->
<color name="primary_text_default_material_light">#de000000</color>
我们可以看到颜色上的 alpha 通道并非完全不透明,这解释了观察到的外观。
最近开始学习Android开发。制作了一个非常简单的 XML 布局,只有一个 LinearLayout
包含一些 ImageViews
和 TextViews
。我在 styles.xml 中使用的主题是
Theme.AppCompat.Light.NoActionBar
对于 TextViews,我还没有设置 textColor,但是在我的 phone 上,文本颜色会自动调整并匹配各自的背景颜色(只是更暗以获得更多对比度)。我喜欢这种效果,但我不知道它来自哪里。
这是 TextView 之一:
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:layout_gravity="center_vertical"
android:textSize="22sp"
android:textStyle="bold"
android:text="Enjoy your view!" />
这是结果(自动文本颜色以红色选择突出显示):
哪个 attribute/setting/class 或其他内置功能对此负责?它取决于phone吗?还是主题?或者...?
默认情况下 TextView
文本颜色由 Theme
决定,您像 Theme.AppCompat.Light.NoActionBar
一样应用,但您可以更改它,只需在 TextView
中添加 android:textColor="#FF0000"
] 这将改变您的文字颜色。这是一个例子。
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="TextView"
android:textSize="36sp"
android:textColor="#FF0000" />
主题驱动您的色彩和行为。 Android 将根据您的基本应用主题将默认颜色应用于您的文本。
你不应该让机会选择你的颜色、字体大小和那种性质的东西。使用您的样式来创建您的通用需求、大小、字体和颜色,并在整个过程中应用该样式。
示例:
<!--Define custom font type-->
<style name="TextAppearance.Light" parent="android:TextAppearance">
<item name="fontPath">fonts/Roboto-Light.ttf</item>
</style>
<style name="TextAppearance.Medium" parent="android:TextAppearance">
<item name="fontPath">fonts/Roboto-Medium.ttf</item>
</style>
<style name="TextAppearance.Regular" parent="android:TextAppearance">
<item name="fontPath">fonts/Roboto-Regular.ttf</item>
</style>
<!--TextView font type "Roboto-Light" style-->
<style name="MyAppTheme.TextView.Light">
<item name="android:textAppearance">@style/TextAppearance.Light</item>
</style>
<style name="MyAppTheme.TextView.Light.Small">
<item name="android:textSize">@dimen/text_size_small</item>
</style>
<style name="MyAppTheme.TextView.Light.Medium">
<item name="android:textSize">@dimen/text_size_medium</item>
</style>
<style name="MyAppTheme.TextView.Light.Large">
<item name="android:textSize">@dimen/text_size_large</item>
</style>
<style name="MyAppTheme.TextView.Light.14sp">
<item name="android:textSize">@dimen/text_size_14</item>
</style>
<style name="MyAppTheme.TextView.Light.12sp">
<item name="android:textSize">@dimen/text_size_14</item>
</style>
<!--TextView font type "Roboto-Medium" style-->
<style name="MyAppTheme.TextView.Medium">
<item name="android:textAppearance">@style/TextAppearance.Medium</item>
</style>
<style name="MyAppTheme.TextView.Medium.Small">
<item name="android:textSize">@dimen/text_size_small</item>
</style>
<style name="MyAppTheme.TextView.Medium.Medium">
<item name="android:textSize">@dimen/text_size_medium</item>
</style>
<style name="MyAppTheme.TextView.Medium.Large">
<item name="android:textSize">@dimen/text_size_large</item>
</style>
<!--TextView font type "Roboto-Regular" style-->
<style name="MyAppTheme.TextView.Regular">
<item name="android:textAppearance">@style/TextAppearance.Regular</item>
</style>
<style name="MyAppTheme.TextView.Regular.Small">
<item name="android:textSize">@dimen/text_size_small</item>
</style>
<style name="MyAppTheme.TextView.Regular.Medium">
<item name="android:textSize">@dimen/text_size_medium</item>
</style>
<style name="MyAppTheme.TextView.Regular.Large">
<item name="android:textSize">@dimen/text_size_large</item>
</style>
<style name="MyAppTheme.TextView.Regular.13sp">
<item name="android:textSize">@dimen/text_size_13</item>
</style>
//通用 TextView 主题
<!--TextView text color and single line true-->
<style name="MyAppTheme.TextView">
<item name="android:singleLine">true</item>
<item name="android:textColor">@android:color/white</item>
</style>
//现在制作与您的普通文本主题不同的主题。 那么所有的文本视图都将遵循上面的,除非你用 style="@styles/MyAppTheme.SomeOtherTextStyle"
改变布局文件本身的样式示例:
<TextView
android:id="@+id/txtLastSavedLabel"
style="@style/MyAppTheme.TextView.Light.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/configuration_list_item_last_saved" />
Theme.AppCompat.Light
主题的默认文本颜色略微半透明,这就是为什么它看起来会针对每种不同的背景颜色进行调整。
我们可以查看源代码以确定实际值,从您选择的主题开始,该主题在 appcompat 的 themes.xml
:
<style name="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
这继承自 Theme.AppCompat.Light
同样 XML:
<style name="Theme.AppCompat.Light" parent="Base.Theme.AppCompat.Light" />
Base.Theme.AppCompat.Light
位于 themes_base.xml
:
<style name="Base.Theme.AppCompat.Light" parent="Base.V7.Theme.AppCompat.Light">
这导致我们在同一个文件中 Base.V7.Theme.AppCompat.Light
:
<style name="Base.V7.Theme.AppCompat.Light" parent="Platform.AppCompat.Light">
然后到 Platform.AppCompat.Light
,我们最终到达颜色设置:
<style name="Platform.AppCompat.Light" parent="android:Theme.Light">
...
<!-- Text colors -->
<item name="android:textColorPrimary">@color/abc_primary_text_material_light</item>
...
abc_primary_text_material_light
is actually a ColorStateList
, which is defined in XML with a <selector>
element, and its file is under appcompat's res/color/
directory:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/primary_text_disabled_material_light"/>
<item android:color="@color/primary_text_default_material_light"/>
</selector>
最后,我们找到默认颜色 - primary_text_default_material_light
- 这是在 res/values/colors_material.xml
:
<!-- 87% black -->
<color name="primary_text_default_material_light">#de000000</color>
我们可以看到颜色上的 alpha 通道并非完全不透明,这解释了观察到的外观。