Acerca del uso de sombreadores de Android (1)

fondo:

En cuanto al uso de sombreadores, creo que la mayoría de los escenarios son posibles, como el siguiente escenario: la
misma imagen, diferentes colores. En este momento, puede utilizar sombreadores para la configuración.

ambiente

como 4.2.2
jdk 8
gana 10

usar

(1) Utilizado en xml. Cuando se usa en xml, solo es necesario declararlo, el ejemplo es el siguiente:

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

En el código anterior, configurar directamente app:tint="@color/c_line_gray" puede configurar la imagen en el color correspondiente.

(2) Establecer en código. El sombreador se puede configurar dinámicamente con el siguiente código:

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

Tenga en cuenta que si desea gestionar la cancelación del sombreador aquí, simplemente reinicie setImageDrawable.

Para los dos métodos de escritura anteriores, no hay problema cuando solo hay un efecto de sombreado en la página. Si hay varios sombreadores, causará problemas de reutilización. Debes llamar a .mutate() para generar un nuevo elemento de diseño. La implementación específica es la siguiente:

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

Bien, observemos el análisis del código fuente de 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;
    }

El significado general es que si no se usa mutate, debido a que Android comparte un objeto dibujable con el mismo resId, si las propiedades del objeto dibujable cambian, otros lugares donde se usa el dibujable también cambiarán. Si se utiliza este método, las propiedades del objeto dibujable se modifican, lo que no afectará al objeto dibujable compartido original.

eso es todo------------------------------------------------ -------------------------------------------------- ---------------------

Supongo que te gusta

Origin blog.csdn.net/motosheep/article/details/129406169
Recomendado
Clasificación