为什么TextView textColor自动调整为背景色调

时间:2018-07-28 15:12:12

标签: android colors textview android-color

我最近开始学习Android开发。制作了一个非常简单的XML布局,仅包含一个LinearLayoutImageViews的{​​{1}}。我在 styles.xml 中使用的主题是

  

Theme.AppCompat.Light.NoActionBar

对于TextView,我还没有设置textColor,但是在我的手机上,文本颜色会自动调整并匹配各自的背景颜色(只有更暗才能获得更大的对比度)。我喜欢这种效果,但我不知道它来自哪里。

这是TextViews之一:

TextViews

这是结果(红色文本中突出显示的自动textColors):

enter image description here

哪个属性/设置/类或其他内置功能负责?是否取决于手机?还是主题?还是...?

3 个答案:

答案 0 :(得分:1)

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实际上是一个ColorStateList,它是使用<selector>元素在XML中定义的,其文件位于appcompat的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通道并不完全不透明,这可以解释观察到的外观。

答案 1 :(得分:0)

默认情况下,TextView的文本颜色由您像Theme一样应用的Theme.AppCompat.Light.NoActionBar确定,但是您可以更改它,只需在android:textColor="#FF0000"中添加TextView会改变您的文字颜色。这是一个例子。

<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" />

答案 2 :(得分:0)

主题驱动您的肤色和行为。 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>

//现在从此处制作与您的常规文本主题不同的主题。 然后,所有的textview都将遵守上述要求,除非您使用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" />