una ropa resaltar programa para online modificar imagen fotos colores color cambiar app aplicaciones android android-imageview android-selector

ropa - Cómo utilizar el selector para tintar la vista de imagen en Android



programa para cambiar el color de una imagen online (6)

Quiero tintar los íconos de mi tabhost usando xml, en lugar de hacerlo programáticamente (de todos modos no pude hacerlo) ... Así que encontré este hilo en SO: cambio de color de vista de imagen de Android para simular un clic de botón

Esa parece ser una solución bastante buena, pero no pude adaptarla correctamente en mi proyecto ... Hice los siguientes cambios:

public class TintableImageView extends ImageView { private ColorStateList tint; public TintableImageView(Context context) { super(context); } //this is the constructor that causes the exception public TintableImageView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public TintableImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } //here, obtainStyledAttributes was asking for an array private void init(Context context, AttributeSet attrs, int defStyle) { TypedArray a = context.obtainStyledAttributes(attrs, new int[]{R.styleable.TintableImageView_tint}, defStyle, 0); tint = a.getColorStateList(R.styleable.TintableImageView_tint); a.recycle(); } @Override protected void drawableStateChanged() { super.drawableStateChanged(); if (tint != null && tint.isStateful()) updateTintColor(); } public void setColorFilter(ColorStateList tint) { this.tint = tint; super.setColorFilter(tint.getColorForState(getDrawableState(), 0)); } private void updateTintColor() { int color = tint.getColorForState(getDrawableState(), 0); setColorFilter(color); } }

Tampoco pude hacer referencia a @drawable/selector.xml en android:tint , así que hice esto en colors.xml:

<?xml version="1.0" encoding="utf-8"?> <resources> <color name="azulPadrao">#2e7cb4</color> <drawable name="tab_icon_selector">@drawable/tab_icon_selector</drawable> </resources>

Mi selector:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:tint="#007AFF" /> <item android:state_focused="true" android:tint="#007AFF" /> <item android:state_pressed="true" android:tint="#007AFF" /> <item android:tint="#929292" /> </selector>

El diseño de mi pestaña:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/TabLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:background="@drawable/tab_bg_selector"> <com.myapp.TintableImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_gravity="center" android:tint="@drawable/tab_icon_selector"/> <TextView android:id="@+id/TabTextView" android:text="Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@drawable/tab_text_selector" android:textSize="10dip" android:textStyle="bold" android:layout_marginTop="2dip"/> </LinearLayout>

¿Alguna sugerencia? Gracias por adelantado

[EDITAR] NumberFormatException una NumberFormatException para usar android:tint NumberFormatException , cuando el correcto era app:tint (después de configurar xmlns:app="http://schemas.android.com/apk/res/com.myapp" ) .. .pero ahora creo que estoy usando mi selector de una manera incorrecta, porque los iconos son negros, sin importar el estado ... He intentado configurar <drawable name="tab_icon_selector">@drawable/tab_icon_selector</drawable> desde dentro de colors.xml, no funcionó

[/EDITAR]


Con la biblioteca de compatibilidad de AppCompat actual, puede usar app:tint en la etiqueta ImageView que se AppCompatImageView como AppCompatImageView y controlar el cambio de estado correctamente.

En AppCompatImageView , puede ver que mImageHelper es notificado del cambio de estado:

@Override protected void drawableStateChanged() { super.drawableStateChanged(); if (mBackgroundTintHelper != null) { mBackgroundTintHelper.applySupportBackgroundTint(); } if (mImageHelper != null) { mImageHelper.applySupportImageTint(); } }

Actualmente, Android Studio da una advertencia sobre esto, pero puedes suprimirlo de manera segura.


Con la biblioteca de soporte 22.1 podemos usar DrawableCompat para tint drawable, API level 4+

DrawableCompat.wrap (Drawable) y setTint (), setTintList () y setTintMode () solo funcionarán: ¡no es necesario crear y mantener dibujables separados solo para admitir varios colores!


En referencia a mi solución en https://.com/a/18724834/2136792 , hay algunas cosas que falta:

TintableImageView.java

@Override protected void drawableStateChanged() { super.drawableStateChanged(); if (tint != null && tint.isStateful()) updateTintColor(); } public void setColorFilter(ColorStateList tint) { this.tint = tint; super.setColorFilter(tint.getColorForState(getDrawableState(), 0)); } private void updateTintColor() { int color = tint.getColorForState(getDrawableState(), 0); setColorFilter(color); }

drawableStateChanged () debe anularse para que el tinte se actualice cuando cambie el estado del elemento.

No estoy seguro de que hacer referencia a un dibujo desde un dibujo pueda causar un problema, pero simplemente puede mover su selector.xml a una carpeta "/ res / color" para hacer referencia a él con "@ color / selector.xml" (aapt se fusiona tanto /res/values/colors.xml como la carpeta / res / color).


Estoy de acuerdo con @Dreaming in Code y daré un ejemplo.

ic_up_small

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/comment_count_selected_color" android:state_selected="true" /> <item android:color="@color/comment_count_text_color"/> </selector>

layout / item_post_count_info.xml

<android.support.v7.widget.AppCompatImageView android:id="@+id/post_upvote_icon" android:layout_width="14dp" android:layout_height="14dp" android:layout_marginLeft="17dp" app:srcCompat="@drawable/ic_up_small" app:tint="@color/post_up_color"/>

Atención: debemos usar app: tint en lugar de android: tint .

La versión de mi biblioteca de soporte es 26.0.2.

app / build.gradle

implementation ''com.android.support:appcompat-v7:26.0.2'' implementation ''com.android.support:support-core-utils:26.0.2'' implementation ''com.android.support:support-annotations:26.0.2'' implementation ''com.android.support:support-v4:26.0.2'' implementation ''com.android.support:design:26.0.2''

Si utilizamos android: tint, se bloqueará y el registro será así:

E / AndroidRuntime: EXCEPCIÓN FATAL: main android.view.InflateException: Línea de archivo XML binario # 0: Error al inflar la clase en android.view.LayoutInflater.createView (LayoutInflater.java:613) en android.view.LayoutInflater.createViewFfactag java: 687) en android.view.LayoutInflater.rInflate (LayoutInflater.java:746) en android.view.LayoutInflater.inflate (LayoutInflater.java:489) en android.view.LayoutInflater.inflate (LayoutInflater.java:396) en com.opera.six.viewholder.post.PostCountInfoViewHolder $ 1.create (PostCountInfoViewHolder.java:29) en com.opera.six.viewholder.post.PostCountInfoViewHolder $ 1.create (PostCountInfoViewHolder.java:25) en com.opera.six. collection.CollectionAdapter.onCreateViewHolder (CollectionAdapter.java:39) en com.opera.six.collection.CollectionAdapter.onCreateViewHolder (CollectionAdapter.java:19) en android.support.v7.widget.RecyclerView $ Adapter.createViewHelder 6493) en android.support.v7.widget.RecyclerView $ Recycler.tryGetViewHolderForPosit ionByDeadline (RecyclerView.java:5680) en android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition (RecyclerView.java:5563) en android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition (Recyclopall.pop at android.support.v7.widget.LinearLayoutManager $ LayoutState.next (LinearLayoutManager.java:2229) en android.support.v7.widget.LinearLayoutManager. .fill (LinearLayoutManager.java:1516) en android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:608) en android.support.v7.widget.RecyclerView.dispatchLayoutSteppc. support.v7.widget.RecyclerView.dispatchLayout (RecyclerView.java:3410) en android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:3962) en android.view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.support.v4.widget.SwipeRefreshLayout.onLayout (SwipeR efreshLayout.java:610) en android.view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.support.design.widget.HeaderScrollingViewBehavior.layoutChild (HeaderScrollingView .java: 132) en android.support.design.widget.ViewOffsetBehavior.onLayoutChild (ViewOffsetBehavior.java:42) en android.support.design.widget.AppBarLayout $ ScrollingViewBehavior.onLayoutChild (AppBarLayout.java). design.widget.CoordinatorLayout.onLayout (CoordinatorLayout.java:869) en android.view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) at android.support.v4 .view.ViewPager.onLayout (ViewPager.java:1767) en android.view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.widget.LinearLayout. setChildFrame (LinearLayout.java:1649) en android.widget.LinearLayout.layoutVertical (LinearLayout.java:1507) en android.widget.LinearLayout.onLayout (LinearLayout.java:1420) en android. view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.widget.FrameLayout.onLayout (FrameLayout.java:448) en android.view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.widget.FrameLayout.onLayout (FrameLayout.java:448) en android.view.View.layout (View.java: 13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.widget.LinearLayout.setChildFrame (LinearLayout.java:1649) en android.widget.LinearLayout.layout (LinearLayout.java:1507) en. widget.LinearLayout.onLayout (LinearLayout.java:1420) en android.view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.widget.FrameLayout.onLayout (FrameLayout.java:448) en android.view.View.layout (View.java:13754) en android.view.ViewGroup.layout (ViewGroup.java:4364) en android.widget.FrameLayout.onLayout (FrameLayout.java: 448) en android.view.View.layout (View.java:13754) en android.view.ViewGrou p.layout (Vi


Implementé esto usando DrawableCompat de la biblioteca de soporte de Android-v4.

Con un ImageButton regular (que subclases ImageView , así que esta información también se aplica a ImageView s), usando un icono negro de la colección de iconos de material :

<ImageButton android:id="@+id/button_add" android:src="@drawable/ic_add_black_36dp" android:background="?attr/selectableItemBackgroundBorderless" android:contentDescription="@string/title_add_item" />

Este es el método de utilidad que he creado:

public static void tintButton(@NonNull ImageButton button) { ColorStateList colours = button.getResources() .getColorStateList(R.color.button_colour); Drawable d = DrawableCompat.wrap(button.getDrawable()); DrawableCompat.setTintList(d, colours); button.setImageDrawable(d); }

Donde res/color/button_colour.xml es un selector que cambia el color del icono de rojo a rojo semitransparente cuando se presiona el botón:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false" android:color="@color/red" /> <item android:color="@color/red_alpha_50pc" /> </selector>

Después de que el ImageButton se haya inflado en el método onCreate() mi actividad, solo llamo al tintButton(...) helper una vez para cada botón.

He probado esto en dispositivos Android 4.1 (mi minSdkVersion ) y 5.0, pero DrawableCompat debería volver a funcionar con Android 1.6.


Si está en API 21+, puede hacerlo fácilmente en XML con un selector y tint :

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true"> <bitmap android:src="@drawable/ic_settings_grey" android:tint="@color/primary" /> </item> <item android:drawable="@drawable/ic_settings_grey"/> </selector>