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:
- Android personalizado XferMode / PorterDuff.Mode
- DrawBitmap al lienzo con un mapa de bits transparente, reemplace los píxeles originales
- Enmascarar (recortar) la imagen en el marco
- ¿Qué significa PorterDuff.Mode en los gráficos android.¿Qué hace?
- DrawableCompat.setTint (drawable, color) vs Drawable.setColorFilter (color, modo)
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?
- Android: Circular Dibujable
- Implementación de diferentes modos PorterDuff en android
- Mostrar TextView con 2 colores separados usando la máscara
- Quiero agregar un filtro de color a la vista de la imagen
- Superposición de color de Android - Modos de PorterDuff
- ¿Cómo crear una máscara para una superposición transparente?
- Android Gauge Animation Pregunta
- Dibujo sobre lienzo - PorterDuff.Mode.CLEAR dibuja negro! ¿Por qué?
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
- InverterLayout
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
- Vista de la lista
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.
- Utilizar ArrayAdapter con AlertDialog y .setAdapter
- El enlace de datos de Android no funciona con los atributos <merge>