Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo aplicar un filtro de color a una vista con todos los niños

¿Cómo puedo grisar una vista de manera uniforme que contiene muchos elementos diferentes – ImageViews, TextViews, imagen de fondo. ¿Tengo que aclarar cada cosa individualmente? ¿O hay una manera de aplicar el mismo filtro de color a todos?

  • Mantenimiento de versiones gratuitas y pro de una aplicación
  • No se puede conectar el ndk-gdb a la aplicación android
  • Cómo agregar APN en Android (KitKat y superior) mediante programación
  • No se pudo encontrar la herramienta de compilación revisión 23.0.1
  • Android: cómo encontrar la posición que se hace clic en el menú contextual
  • Android ViewPager y ListViews
  • Aplicación de Android como servicio sin actividad
  • Administrar la clave de la API de Google Maps con Gradle en Android Studio
  • Selección de TextView con Spannable y LinkMovementMethod
  • ActionBar imagen de fondo
  • Biblioteca FloatingActionButton de terceros en CoordinatorLayout
  • Android Studio muestra la exclamación roja en el atributo dibujable
  • 5 Solutions collect form web for “Cómo aplicar un filtro de color a una vista con todos los niños”

    A menos que alguien más tenga una mejor respuesta, mi método actual es graying hacia fuera cada artículo separly.

    PorterDuffColorFilter greyFilter = new PorterDuffColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY); myLayout.getBackground().setColorFilter(greyFilter); myImageView.setColorFilter(greyFilter); myTextView.setTextColor(0xff777777); 

    Para más o nidos hijos probablemente un bucle con instanceof sería adecuado, pero no lo necesito.

    Editar: Este filtro no es en realidad gris, un mejor filtro está aquí: Drawable => escala de grises Que se puede utilizar de la misma manera.

    Es fácil hacerlo definiendo un grupo de vistas personalizadas de la siguiente manera:

     public class MyViewContainer extends XXXLayout { //XXLayout could be LinearLayout, RelativeLayout or others private Paint m_paint; //define constructors here and call _Init() at the end of constructor function private void _Init() { ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); m_paint = new Paint(); m_paint.setColorFilter(new ColorMatrixColorFilter(cm)); } @Override protected void dispatchDraw(Canvas canvas) { canvas.saveLayer(null, m_paint, Canvas.ALL_SAVE_FLAG); super.dispatchDraw(canvas); canvas.restore(); } } 

    Todas las vistas de niños de MyViewContainer se mostrarán en gris. Todos los derechos reservados

    La respuesta de Sam Lu es un buen comienzo, pero tuve problemas de rendimiento y decidí cambiar a capas de hardware. Con capas de hardware, puede hacerlo así:

     private final Paint grayscalePaint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); grayscalePaint.setColorFilter(new ColorMatrixColorFilter(cm)); public void setGrayedOut(boolean grayedOut) { if (grayedOut) { setLayerType(View.LAYER_TYPE_HARDWARE, grayscalePaint); } else { setLayerType(View.LAYER_TYPE_NONE, null); } } 

    Tenga cuidado de no hacer las capas en dispatchDraw() sí como que se bloqueará la aplicación.

    Depende enteramente del método que usted está utilizando para "gris" artículos. Si lo está haciendo llamando a setEnabled(false) en el ViewGroup padre, por defecto los flags de estado (como disabled) no fluyen hasta las vistas secundarias. Sin embargo, hay dos maneras simples de personalizar esto:

    Una opción es agregar el atributo android:duplicateParentState="true" a cada vista secundaria en su XML. Esto le indicará a los niños que obtengan sus banderas estatales de los padres. Esto reflejará TODOS los indicadores sin embargo, incluyendo presionado, comprobado, etc … no apenas permitido.

    Otra opción es crear una subclase personalizada de su ViewGroup y sobreescribir setEnabled() para llamar también a todas las vistas secundarias, es decir

     @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); for(int i=0; i < getChildCount(); i++) { getChildAt(i).setEnabled(enabled); } } 

    Lo que me gusta hacer es crear una vista que se superpone a la vista que está tratando de tinte y establecer su fondo a un color transparente. A continuación, puede activar y desactivar el matiz definiendo la visibilidad de las vistas

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ViewYouWantToTint android:layout_width="match_parent" android:layout_height="match_parent"/> <View android:id="@+id/disabled_tint_overlay" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/darkTint" android:visibility="invisible"/> </FrameLayout> 

    Luego en su controlador:

     m_DisabledBlackTintOverlay = (View) view.findViewById(R.id.login_disabled_black_tint_overlay); m_DisabledBlackTintOverlay.setVisibility(View.VISIBLE); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.