Efectos de color PorterDuff en android para vistas bajo una vista determinada

¿Es posible en Android configurar una vista de manera que aplique algún filtro de color a todo lo que está visible en sus límites? Como en este ejemplo:

Vista de filtrado

Simplemente una simple vista rectangular que invierte los colores de todo lo que está debajo. Por supuesto, cuando el usuario desplaza la lista también se refleja en la caja invertida. ¿Hay alguna manera fácil de hacerlo utilizando filtros de color, modos PorterDuff, etc?

Está intentando resolver este problema utilizando una jerarquía de vista como esta:

  • Padre
    • Vista de la lista
    • InverterView

El problema es que, en esta posición, InverterView no tiene ningún control sobre cómo se elabora ListView . ¿Pero sabes quién tiene control sobre cómo se dibuja ListView ? El diseño padre de ListView sí. En otras palabras, lo que realmente quieres es una jerarquía como esta:

  • Padre
    • InverterLayout
      • Vista de la lista

Ahora InverterLayout es responsable de dibujar ListView , y puede aplicar efectos a él.

 class InverterLayout extends FrameLayout { // structure to hold our color filter private Paint paint = new Paint(); // the color filter itself private ColorFilter cf; // the rectangle we want to invert private Rect inversion_rect = new Rect(100, 100, 300, 300); public InverterLayout(Context context) { super(context); // construct the inversion color matrix float[] mat = new float[] { -1, 0, 0, 0, 255, 0, -1, 0, 0, 255, 0, 0, -1, 0, 255, 0, 0, 0, 1, 0 }; cf = new ColorMatrixColorFilter(new ColorMatrix(mat)); } @Override protected void dispatchDraw(Canvas c) { // create a temporary bitmap to draw the child views Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888); Canvas cc = new Canvas(b); // draw them to that temporary bitmap super.dispatchDraw(cc); // copy the temporary bitmap to screen without the inversion filter paint.setColorFilter(null); c.drawBitmap(b, 0, 0, paint); // copy the inverted rectangle paint.setColorFilter(cf); c.drawBitmap(b, inversion_rect, inversion_rect, paint); } } 

Al usar esto, asegúrese de que la vista de su hijo tenga su propio fondo . Si la vista es transparente y el fondo de la ventana se muestra, el fondo de la ventana no se invertirá, ya que el InverterLayout no tiene control sobre cómo se dibuja la ventana.

Si pudiera simplemente comentar lo haría, porque no estoy seguro de estar bien aquí. Así que comprador tenga cuidado, aquí va:

Creo que puede ser capaz de lograr este efecto aprovechando View.OnDragEve [] ntListener. Aquí está la documentación .

Creo que debe ajustar el arrastre y soltar el modelo de disparo utilizado en android (es decir, los medios de comunicación entre la aplicación y el sistema operativo). La forma en que lo modificas dependerá enteramente del mecanismo (s) dentro de tu aplicación que obligue a una vista a los límites de otra. Una vez que usted figura que hacia fuera usted puede entonces hacer la magia avanzada del color con: ColorMatrix , PorterDuffColorFilter , y varios otros.

Esto me suena mucho más fácil que la alternativa Xfermode . ¡Buena suerte!

Esto es lo que haría:

Ver jerarquía:

  • RelativeLayout (o FrameLayout)
    • Vista de la lista
      • CustomInverterView

InverterView se coloca por OnTouch de la vista principal (RelativeLayout) en el onTouchListener:

 if (event.getAction() == MotionEvent.ACTION_MOVE) // Set Coordinates for the custom View. // Copy the bitmapCache of the ListView (jsut the portion you need // and send it to the customView. // Apply the filters you want. // Invalidate! 

Implementé una lupa usando este método. Funciona a las mil maravillas. Tal vez pueda publicar algún código más tarde, pero estoy un poco ocupado en este momento.

  • Dibuja un círculo transparente sobre un lienzo lleno de android
  • ¿Cómo puedo hacer una aplicación de rompecabezas en droid sin quedarme sin memoria?
  • PorterDuff y ruta
  • Cómo dibujar en mapa de bits utilizando otro mapa de bits como máscara?
  • Android Porter-Duff Composición de rendimiento
  • Android ColorFilter - Modos de Porter-Duff
  • Mezclar dos imágenes junto con multiplicar y% de opacidad
  • Dibuje las áreas superpuestas en un trayecto
  • Android con PorterDuff para combinar imágenes
  • Perforar un agujero en una superposición de rectángulo con aceleración HW activada en Ver
  • Porter-Duff: ¿comportamiento diferente para diferentes formas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.