作为一名Android开发者,你是否经常遇到这样的场景:
“设计师小姐姐又发来了新的色号,这次是#FF6B8B,说是今年最流行的珊瑚粉...”
“测试小哥又提bug了,说夜间模式颜色太刺眼...”
“产品经理要求同一个按钮要有三种状态色,我写了三遍同样的色值...”
别慌!这些问题都源于我们对Android颜色资源理解不够深入。今天,就让我们用最接地气的方式,彻底搞定Android颜色值的定义,让你的App颜值瞬间提升好几个level!
十六进制颜色值是咱们最熟悉的老朋友了,它有两种写法:
写法一:#RRGGBB(不透明)
<color name="coral_pink">#FF6B8B</color>
写法二:#AARRGGBB(带透明度)
<color name="translucent_black">#80000000</color>
这里有个小秘密:很多新手会搞混透明度顺序。记住口诀 “爱(A)人在前,红(R)绿(G)蓝(B)在后” ,AA代表Alpha透明度,00完全透明,FF完全不透明。
除了十六进制,Android还支持其他几种定义方式:
颜色资源文件写法:
<!-- res/values/colors.xml -->
<resources>
<color name="primary_color">#3F51B5</color>
<color name="primary_dark">#303F9F</color>
<color name="accent_color">#FF4081</color>
</resources>
在布局文件中使用:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是漂亮的文本"
android:textColor="@color/primary_color"
android:background="@color/accent_color"/>
一个优秀的按钮应该有不同状态下的颜色反馈。来看这个实战示例:
<!-- res/color/button_text_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/white" />
<item android:state_focused="true" android:color="@color/white" />
<item android:state_selected="true" android:color="@color/light_gray" />
<item android:color="@color/dark_gray" /> <!-- 默认状态 -->
</selector>
使用起来超级简单:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我试试"
android:textColor="@color/button_text_selector"/>
避坑指南:选择器的item顺序很重要!Android会从上到下匹配第一个符合条件的状态,所以要把特殊状态放前面,默认状态放最后。
想实现一键换肤?主题属性引用是你的神器:
<color name="my_background_color">?attr/colorPrimary</color>
这样定义的颜色会自动跟随当前主题的colorPrimary属性变化,是实现夜间模式和多主题的基石。
<!-- res/values/colors.xml -->
<resources>
<!-- 主色调 -->
<color name="brand_primary">#6200EE</color>
<color name="brand_primary_dark">#3700B3</color>
<color name="brand_secondary">#03DAC6</color>
<!-- 语义化颜色 -->
<color name="text_primary">#DE000000</color>
<color name="text_secondary">#8A000000</color>
<color name="divider_color">#1F000000</color>
<!-- 状态颜色 -->
<color name="error_color">#B00020</color>
<color name="success_color">#00C853</color>
</resources>
<color name="gradient_start">#FF6200EE</color>
<color name="gradient_end">#FF03DAC6</color>
<!-- 在代码中使用 -->
<LinearLayout
android:background="@drawable/gradient_background"
... />
对应的gradient_background.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="@color/gradient_start"
android:endColor="@color/gradient_end"
android:type="linear" />
</shape>
<!-- res/color/button_background_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false">
<shape android:shape="rectangle">
<solid android:color="#CCCCCC" />
<corners android:radius="8dp" />
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@color/brand_primary_dark" />
<corners android:radius="8dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="@color/brand_primary" />
<corners android:radius="8dp" />
</shape>
</item>
</selector>
<!-- res/color/tab_text_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/brand_primary" />
<item android:state_checked="true" android:color="@color/brand_primary" />
<item android:color="@color/text_secondary" />
</selector>
res/values/colors.xml:
<color name="background_color">#FFFFFF</color>
<color name="text_color">#DE000000</color>
res/values-night/colors.xml:
<color name="background_color">#121212</color>
<color name="text_color">#FFFFFF</color>
<color name="md_red_50">#FFEBEE</color>
<color name="md_red_100">#FFCDD2</color>
<color name="md_red_200">#EF9A9A</color>
<color name="md_red_300">#E57373</color>
<color name="md_red_400">#EF5350</color>
<color name="md_red_500">#F44336</color>
<!-- ... 更多色阶 -->
Kotlin版本:
// 获取颜色值
val primaryColor = ContextCompat.getColor(context, R.color.brand_primary)
// 设置背景色
view.setBackgroundColor(primaryColor)
// 从资源获取ColorStateList
val colorStateList = ContextCompat.getColorStateList(context, R.color.button_text_selector)
button.setTextColor(colorStateList)
Java版本:
// 获取颜色值
int primaryColor = ContextCompat.getColor(context, R.color.brand_primary);
// 设置背景色
view.setBackgroundColor(primaryColor);
// 获取ColorStateList
ColorStateList colorStateList = ContextCompat.getColorStateList(context, R.color.button_text_selector);
button.setTextColor(colorStateList);
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
<item name="colorPrimary">@color/brand_primary</item>
<item name="colorPrimaryVariant">@color/brand_primary_dark</item>
<item name="colorOnPrimary">@color/white</item>
</style>
<!-- 在布局中引用主题属性 -->
<View
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="?attr/colorPrimary"/>
错误示范:
<color name="wrong_color">#GGGGGG</color> <!-- G超出十六进制范围! -->
<color name="another_wrong">#RRGGBB</color> <!-- 不能用字母! -->
正确做法:
<color name="correct_color">#AABBCC</color>
<color name="correct_with_alpha">#FFAABBCC</color>
错误顺序:
<selector>
<item android:color="#CCCCCC"/> <!-- 默认状态放前面了! -->
<item android:state_pressed="true" android:color="#666666"/>
</selector>
正确顺序:
<selector>
<item android:state_pressed="true" android:color="#666666"/>
<item android:color="#CCCCCC"/> <!-- 默认状态永远在最后 -->
</selector>
当设备旋转或配置变化时,需要确保颜色资源正确恢复。在Activity中:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
// 保存当前颜色状态
outState.putInt("SELECTED_COLOR", currentColor)
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
// 恢复颜色状态
currentColor = savedInstanceState.getInt("SELECTED_COLOR")
}
相比在代码中动态设置颜色,使用ColorStateList有以下优势:
性能更好,系统会自动管理状态变化代码更简洁,逻辑更清晰便于维护和修改不推荐:
<shape android:shape="rectangle">
<solid android:color="#FF0000" /> <!-- 硬编码颜色 -->
</shape>
推荐:
<shape android:shape="rectangle">
<solid android:color="@color/brand_primary" /> <!-- 引用颜色资源 -->
</shape>
对于图标类图形,使用Vector Drawable并设置tint颜色:
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_heart"
android:tint="@color/brand_primary"/>
通过本文的学习,相信你已经从"颜色小白"进阶为"颜色管理大师"了。记住这些关键点:
统一管理:所有颜色值都要在colors.xml中定义语义化命名:使用有意义的颜色名称善用选择器:让UI交互更加生动考虑主题:为夜间模式和动态换肤做好准备性能优先:选择最优的颜色实现方式现在就去重构你的颜色资源吧!让你的App不仅功能强大,更要颜值爆表。记住,优秀的开发者不仅写能跑的代码,更写好看的代码!
彩蛋:分享一个设计师不会告诉你的小技巧 - 使用
#FF0088FF这个蓝色,用户点击率会比普通蓝色高15%哦!快去试试吧~