Android语言基础教程(131)Android颜色(color)资源之使用颜色资源:别再把颜色代码乱扔了!Android颜色资源の“装修宝典”,让你的App颜值狂飙!

朋友们,想象一下这个场景:你正在装修你的梦幻App小屋,设计师给了你一份超详细的配色方案。结果你呢,拎着几桶油漆(颜色代码),走到哪刷到哪,墙上刷一点#FF6B8B,按钮上刷一点#FF6B8B,突然设计师说:“这个粉色要再深一点,改成#E91E63。”

完了!你是不是得拿着小刷子,满世界找所有你刷过#FF6B8B的地方,一个一个地去改?手忙脚乱,还容易漏掉几个,搞得App像个打了补丁的旧衣服。

Stop!是时候请出我们今天的主角——Android颜色资源(Color Resources)了! 它就像是你的专属色彩管家,或者一个智能调色中心,让你管理App颜色像喊“小爱同学”开灯一样简单。

第一幕:颜色资源是个啥?为啥要用它?

简单说,颜色资源就是一个把你用的颜色值(比如#FF6B8B)起个名字(比如colorPrimary),然后存起来的神奇盒子。

为啥要费这事?三大理由,让你无法拒绝:

  1. 一键换肤,效率之王:上面那个“改粉色”的悲剧,如果用颜色资源,你只需要在“色彩管家”(colors.xml文件)里,把colorPrimary的值从#FF6B8B改成#E91E63。然后,所有用了@color/colorPrimary的地方,自动全部生效!一秒搞定,深藏功与名。
  2. 风格统一,专业范儿:你的App主色、辅助色、背景色、文字色都被定义成colorPrimarycolorAccentbackgroundtextColor这样的语义化名字。整个团队一看就懂,协作起来那叫一个顺畅,App风格想不统一都难。
  3. 多主题适配,未来可期:你想搞个夜间模式?简单!再创建一个colors.xml (night)文件,在里面为同样的名字(如background)定义一套暗色系的值。系统会根据当前主题自动切换,轻松实现“白天不懂夜的黑”。
第二幕:手把手,创建你的专属调色盘(colors.xml)

理论说再多,不如上手干。你的调色盘就放在 res/values/colors.xml 这个文件里。如果没有,自己创建一个就好。

我们来定义一个经典的Material Design配色方案:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 主色调,用于导航栏、重要按钮等 -->
    <color name="color_primary">#3F51B5</color>
    <color name="color_primary_dark">#303F9F</color>
    <color name="color_primary_light">#C5CAE9</color>
    <!-- 强调色,用于浮动按钮、选项、进度条等 -->
    <color name="color_accent">#FF4081</color>
    <!-- 背景与文字颜色 -->
    <color name="background">#F5F5F5</color>
    <color name="text_primary">#212121</color>
    <color name="text_secondary">#757575</color>
    <color name="divider">#BDBDBD</color>
    <!-- 语义化颜色(比如成功、警告、错误) -->
    <color name="success_green">#4CAF50</color>
    <color name="warning_orange">#FF9800</color>
    <color name="error_red">#F44336</color>
    <!-- 带透明度的颜色(ARGB) -->
    <color name="semi_transparent_black">#80000000</color>
    <color name="transparent_white_50">#80FFFFFF</color>
</resources>

敲黑板,看重点:

  • name就是你给这桶油漆起的名字,要见名知意。我用了下划线命名法,很舒服。
  • 颜色值可以是#RGB#ARGB#RRGGBB#AARRGGBB。最常用的是后两种。A代表Alpha(透明度),00全透,FF不透。
  • 看最后两个,#80000000就是50%透明的黑色,#80FFFFFF就是50%透明的白色。做遮罩、阴影效果时超好用!
第三幕:开刷!在各地“涂抹”你的颜色

调色盘准备好了,现在开始“装修”你的App!

1. 在XML布局文件中使用(最常用)

在你的 activity_main.xml 或任何布局文件里,用@color/你的颜色名来引用。

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background"> <!-- 使用背景色 -->

    <TextView
        android:id="@+id/titleText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是最靓的仔"
        android:textColor="@color/text_primary" <!-- 使用主文字色 -->
        android:textSize="24sp" />

    <Button
        android:id="@+id/primaryButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="主要按钮"
        android:backgroundTint="@color/color_primary" <!-- 给按钮背景“上色” -->
        android:textColor="@white" <!-- 当然也可以直接用系统自带的颜色 --> />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/divider" /> <!-- 一条分割线 -->

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:backgroundTint="@color/color_accent" <!-- 浮动按钮用强调色 -->
        app:srcCompat="@android:drawable/ic_dialog_email" />

</androidx.constraintlayout.widget.ConstraintLayout>

2. 在Java/Kotlin代码中动态使用

有时候颜色需要根据逻辑变化,比如“切换主题”,这就需要在代码里操作了。

Kotlin版本:

// 设置视图背景色
titleText.setBackgroundColor(ContextCompat.getColor(this, R.color.color_primary))
// 或者
titleText.setBackgroundColor(getColor(R.color.success_green)) // API 23+

// 设置文字颜色
titleText.setTextColor(ContextCompat.getColor(this, R.color.text_primary))

// 如果你拿到的是一个颜色值字符串,可以通过 Color.parseColor 解析
val dynamicColor = "#FF9800"
someView.setBackgroundColor(Color.parseColor(dynamicColor))

Java版本:

// 设置视图背景色
titleText.setBackgroundColor(ContextCompat.getColor(this, R.color.color_primary));
// 或者 (API 23+)
titleText.setBackgroundColor(getColor(R.color.success_green));

// 设置文字颜色
titleText.setTextColor(ContextCompat.getColor(this, R.color.text_primary));
第四幕:炫技时间!完整示例 - 打造一个“状态指示器”

光说不练假把式。我们来搞个有点意思的:一个根据不同状态改变背景色和文字的卡片。

1. 首先,在colors.xml里加几个状态色:

<color name="status_normal">#E8F5E9</color>
<color name="status_warning">#FFF8E1</color>
<color name="status_error">#FFEBEE</color>

2. 布局文件 layout_status_card.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/statusCard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    app:cardCornerRadius="8dp"
    app:cardElevation="4dp">

    <LinearLayout
        android:id="@+id/statusBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp"
        android:background="@color/status_normal"> <!-- 默认背景 -->

        <TextView
            android:id="@+id/statusTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="系统状态"
            android:textColor="@color/text_primary"
            android:textSize="18sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/statusMessage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text="一切运行正常"
            android:textColor="@color/text_secondary" />

    </LinearLayout>
</androidx.cardview.widget.CardView>

3. 在Activity中玩转它(Kotlin):

class MainActivity : AppCompatActivity() {

    private lateinit var statusCard: CardView
    private lateinit var statusBackground: LinearLayout
    private lateinit var statusTitle: TextView
    private lateinit var statusMessage: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) // 假设主布局包含了上面的 statusCard

        // 绑定视图
        statusCard = findViewById(R.id.statusCard)
        statusBackground = findViewById(R.id.statusBackground)
        statusTitle = findViewById(R.id.statusTitle)
        statusMessage = findViewById(R.id.statusMessage)

        // 模拟一个按钮点击来切换状态
        val switchButton: Button = findViewById(R.id.primaryButton)
        switchButton.setOnClickListener {
            toggleStatus()
        }
    }

    private fun toggleStatus() {
        // 模拟随机状态
        val randomState = (0..2).random()

        when (randomState) {
            0 -> setStatusNormal()
            1 -> setStatusWarning()
            2 -> setStatusError()
        }
    }

    private fun setStatusNormal() {
        statusBackground.setBackgroundColor(ContextCompat.getColor(this, R.color.status_normal))
        statusTitle.text = "一切正常"
        statusMessage.text = "所有系统都在最佳状态下运行。"
        statusMessage.setTextColor(ContextCompat.getColor(this, R.color.success_green))
    }

    private fun setStatusWarning() {
        statusBackground.setBackgroundColor(ContextCompat.getColor(this, R.color.status_warning))
        statusTitle.text = "发现警告"
        statusMessage.text = "系统资源占用较高,建议检查。"
        statusMessage.setTextColor(ContextCompat.getColor(this, R.color.warning_orange))
    }

    private fun setStatusError() {
        statusBackground.setBackgroundColor(ContextCompat.getColor(this, R.color.status_error))
        statusTitle.text = "发生错误"
        statusMessage.text = "检测到关键服务异常,请立即处理!"
        statusMessage.setTextColor(ContextCompat.getColor(this, R.color.error_red))
    }
}

看!通过颜色资源,我们轻松实现了动态换肤。所有颜色都来源于中心化的调色盘,管理起来一目了然。如果你想调整“警告色”的色调,只需要去colors.xml里修改status_warning一个地方就够了!

尾声:从“油漆工”到“装修大师”

怎么样?是不是感觉再回去用硬编码就像从智能家居时代回到钻木取火?

总结一下,使用Android颜色资源,就是你从野蛮生长的“街头涂鸦者”进阶为有设计图的“专业室内设计师”的关键一步。它让你的代码更干净、更易维护、更专业。

所以,从现在开始,告别散兵游勇式的颜色代码,拥抱你的中央色彩军团吧! 你的App颜值和你的开发效率,都会因此“狂飙”起来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值