RenderEffect-Reduce saturación-estilo Android
En el momento de escribir este artículo, en marzo de 2021, la lectura preliminar auténtico para desarrolladores de Android 12 llegó recientemente. Si hay muchos rumores, Android 12 tendrá una puesta al día del sistema de diseño indicación Material NEXT. Aunque los detalles de lo que esto en realidad significa son vagos, puede tener similitudes con otras plataformas móviles. Un patrón de interfaz de beneficiario global en iOS es desenfocar el fondo detrás del componente de interfaz de beneficiario en primer plano. Por ejemplo, un cuadro de diálogo.Durante mucho tiempo, esto se puede alcanzar dibujando en Android View
A un Bitmap
Luego use RenderScript u OpenGL para difuminarlo. Pero existen posibles problemas de rendimiento y es posible que no se realice de forma uniforme en toda la plataforma. Adecuado a la aparición de nuevas API en Android 12, esta situación parece estar a punto de cambiar: RenderEffect
En el artículo aludido, estudiamos cómo aplicar el objeto de desenfoque a View
Clasificación.Sin retención, este no es el único objeto que podemos alcanzar. RenderEffect
-hay mas. En este artículo, exploraremos otra reducción de la saturación del objeto. Pero más allá de eso, todavía estudiaremos cómo aplicar múltiples mercancía a la vez.
Desaturación
En marzo de 2013, publiqué un artículo que mostraba cómo usar ColorMatrixColorFilter
. Estos son los días previos a nuestra API de sombreado incorporada. View
. Estos solo llegaron en las piruletas anunciadas en 2014. ColorMatrixColorFilter()
Sigue siendo una aparejo poderosa para cambiar dinámicamente los colores de imágenes y medios gráficos.
RenderEffect
Creación de soporte RenderEffect
Almohadilla de ColorFilter
Nos permite aplicar estos mercancía como parte del proceso de renderizado acelerado por hardware.
Para desaturar la imagen, primero creamos un ColourMatrix
Objeto y ajuste el nivel de saturación.Lo envolvemos en ColorMatricColorFilter
Puede estilarse como RenderEffect
Método de taller:
val desaturateEffect = RenderEffect.createColorFilterEffect (ColorMatrixColorFilter (ColorMatrix (). apply setSaturation (saturationAmount))))
valía Objetivo de desaturación = Objetivo de renderizado.createColorFilterEffect( ColorMatrixColorFilter( Matriz de color().Solicitud setSaturation(Saturación)
) ) |
Aplicamos este objeto exactamente de la misma forma que el objeto de desenfoque:
binding.image.setRenderEffect (desaturateEffect)
Amarrado.imagen.setRenderEffect(desaturateEffect) |
Ahora, podemos ajustar la saturación de la imagen. La saturación aquí es 1, con información de color completa:
Aquí hay 0: se eliminan todos los colores, dejando una imagen en escalera de grises:
Esclavitud
Como mencioné en el artículo aludido, aunque la API es un poco más completa, podemos obtener una longevo funcionalidad. Un buen ejemplo es vincular múltiples mercancía.Nuestro método creador de mercancía de desenfoque y desaturación produce RenderEffect
Ejemplo. Sin retención, estos tienen mercancía muy diferentes.
Podemos encadenar múltiples RenderEffects
juntos:
RenderEffect.createChainEffect (objeto de desenfoque, objeto de desaturación)
Objetivo de renderizado.createChainEffect(Objetivo de desenfoque, Objetivo de desaturación) |
Esto createChainEffect()
El método en sí mismo volverá RenderEffect
Instancia, podemos aplicarlo a View
Exactamente lo mismo que hicimos antiguamente.Ahora, podemos usar el desenfoque y la desaturación como uno RenderEffect
:
Junto a mencionar que el orden de los medios de la dependencia puede ser importante. En este caso, la canalización realizará primero la desaturación y luego el desenfoque. Si revertimos estos resultados, los resultados serán sutilmente diferentes. Dependiendo del objeto exacto superpuesto, estas diferencias pueden volverse más pronunciadas.
Sin retención, la dependencia RenderEffect
Se puede aplicar a View
Estructura jerárquica, como hicimos para el objeto de desenfoque:
en conclusión
Espero que a partir de estos ejemplos de implementación muy simples, podamos ver claramente las funciones que RenderEffect puede alcanzar. Encima, la capacidad de vincularlos requiere solo una pequeña cantidad de trabajo adicional para aumentar significativamente la funcionalidad. De hecho, una sarta extra de código.
Hemos introducido algunos conocimientos básicos que podemos utilizar. RenderEffect
. Sospecho que volveré a examinar esta pregunta y ofreceré otros ejemplos interesantes en el futuro. Si desea verlos, deje un comentario o envíeme un correo electrónico para hacérmelo asimilar; póngase en contacto con los datos aquí.
El código fuente de este artículo está aquí.
© 2021, Mark Allison (Mark Allison). reservados todos los derechos.
relacionados
Copyright © 2021 Estilo de Android. reservados todos los derechos.
Para obtener información sobre cómo reutilizar o retornar a difundir este trabajo, visite http://blog.stylingandroid.com/license-information.