关于安卓着色器的使用(一)

简介: 关于安卓着色器的使用(一)

背景:

对于着色器的使用,相信大部分的场景都有可能出现,例如以下的场景:
同一个图片,不同的颜色。这个时候,就可以使用着色器进行配置。

环境

as 4.2.2
jdk 8
win 10

使用

(一)xml中使用。当在xml中使用的时候,只需要申明即可,例子如下:

                        <ImageView
                            android:id="@+id/iv_select_music"
                            android:layout_width="12dp"
                            android:layout_height="12dp"
                            android:src="@drawable/ic_select_course_subject_arr"
                            app:layout_constraintBottom_toBottomOf="@+id/tv_select_music_text"
                            app:layout_constraintEnd_toEndOf="parent"
                            app:layout_constraintTop_toTopOf="@+id/tv_select_music_text"
                            app:tint="@color/c_line_gray" />

上述代码中, 直接设置 app:tint="@color/c_line_gray" 既可以把图片设置成为对应的颜色。

(二)代码中设置。通过以下代码,可以动态设置着色器:

            val drawableRes = ResourcesCompat.getDrawable(
                resources,
                resId, null
            ) ?: return
            val tintIcon = DrawableCompat.wrap(drawableRes)
            DrawableCompat.setTint(tintIcon, hintColor)
            setImageDrawable(tintIcon)

注意,如果这里要处理取消着色器,重新设置setImageDrawable即可。

对于上述两种写法,页面中只有一个着色器效果的时候,都是没有问题的。若是多个着色器,则会导致复用问题。需要调用.mutate()生成一个新的drawable即可。具体实现如下:

            val drawableRes = ResourcesCompat.getDrawable(
                resources,
                resId, null
            ) ?: return
            val tintIcon = DrawableCompat.wrap(drawableRes.mutate())
            DrawableCompat.setTint(tintIcon, hintColor)
            setImageDrawable(tintIcon)

好了,观察mutate的源码解析:

    /**
     * Make this drawable mutable. This operation cannot be reversed. A mutable
     * drawable is guaranteed to not share its state with any other drawable.
     * This is especially useful when you need to modify properties of drawables
     * loaded from resources. By default, all drawables instances loaded from
     * the same resource share a common state; if you modify the state of one
     * instance, all the other instances will receive the same modification.
     *
     * Calling this method on a mutable Drawable will have no effect.
     *
     * @return This drawable.
     * @see ConstantState
     * @see #getConstantState()
     */
    public @NonNull Drawable mutate() {
        return this;
    }

大概的意思,如果不使用mutate的情况下,因为安卓共用一个同resId的drawable对象,所以如果drawable对象的属性发生了变化,则会导致其他使用到该drawable的地方,也会发生变化。若使用了该方法后,drawable对象的属性修改,不会对原有的共享的drawble对象产生影响。

that's all-----------------------------------------------------------------------------------------------------------------------

目录
相关文章
|
安全 网络安全 数据安全/隐私保护
网站为何会显示“不安全”?又该怎么办呢?
这篇文章概述了导致网站显示为“不安全”的常见原因,并提供了相应的解释和建议。了解这些信息对于网站管理员和普通用户都是重要的,因为它有助于提高网络安全意识和保护个人信息不被泄露。
3713 0
|
缓存 Ubuntu Java
Tool之Bazel:Bazel的简介、安装、使用方法之详细攻略
Tool之Bazel:Bazel的简介、安装、使用方法之详细攻略
|
Android开发
Android Stadio Build 窗口字符串乱码问题
在使用Android Studio过程中,如果遇到Build窗口字符串乱码问题,可以通过编辑`studio.vmoptions`文件添加`-Dfile.encoding=UTF-8`配置并重启Android Studio来解决。
685 2
Android Stadio Build 窗口字符串乱码问题
|
JSON 前端开发 JavaScript
前端使用lottie-web,使用AE导出的JSON动画贴心教程
前端使用lottie-web,使用AE导出的JSON动画贴心教程
1875 2
|
机器学习/深度学习 算法 Python
OpenAI Gym高级教程——解决实际问题与研究探索
OpenAI Gym高级教程——解决实际问题与研究探索
653 1
|
小程序 前端开发 JavaScript
基于uniapp的学生(选课)成绩小程序
本系统2022年4月创作完成,该系统包含小程序端和管理端,适合选题:小程序、学生成绩、学生选课、成绩管理。系统小程序端采用uniapp+uview实现,小程序接口和管理端采用springboot+mybatis开发,使用mysql数据库,下面是大概的功能。
基于uniapp的学生(选课)成绩小程序
浅谈RISC-V指令集的基本指令格式和立即数操作
在以前的文章中,我分享了RISC-V在设计的初衷,除了可以被通用软件开发使用之外,还有一个目的就是,可以支持更多定制化的设计。也就是说,用户可以在基本指令集上面,进行一个或者多个的指令集扩展操作,但是有一个条件,不能再重新定义基本指令集。也就是说,任何一款基于RISC-V指令集的处理器,都要能够支撑整数基本指令集。可以看出基本指令集的重要性。
1771 0
|
弹性计算 数据库 对象存储
阿里云人工客服联系方式(分享3种途径)
阿里云售后或售前可以联系人工客服,小编分享三种联系阿里云官方人工客服的方法
39030 2
阿里云人工客服联系方式(分享3种途径)