RenderEffect-Blur-Stylize Android
En el momento de escribir este artículo, en marzo de 2021, la horizonte previa 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 agraciado popular en iOS es desenfocar el fondo detrás del componente de interfaz de agraciado en primer plano. Por ejemplo, un cuadro de diálogo.Durante mucho tiempo, esto se puede conseguir 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 guisa uniforme en toda la plataforma. Conveniente a la aparición de nuevas API en Android 12, esta situación parece estar a punto de cambiar: RenderEffect
referencias
Mencioné en la presentación que ya podemos hacer lo que tenemos que hacer.Qué es eso RenderEffect
¿proporciónanos? A mi entender, lo más importante es el rendimiento. Uso de Android RenderNodes
Cree una grado de renderización acelerada por hardware internamente. Básicamente, esto significa que su grado de interfaz de agraciado se representará en la GPU. RenderEffect
Resuma este mecanismo y permítanos aplicar varios género, que se aplicarán como parte del proceso de renderizado acelerado por hardware. Esto nos traerá poco de eficiencia. En primer extensión, la GPU se utilizará para realizar el procesamiento de género, por lo que no tenemos que preocuparnos por eso. En segundo extensión, trátelo solo cuando la parte relevante de la grado de la IU no sea válida y deba retornar a dibujarse. La tercera delantera es que la API es muy sencilla de utilizar.Hacer equivalente RenderScript
Requerirá más esfuerzo y código. Finalmente, vale la pena mencionar que es probable que cualquier procesamiento requerido por la CPU (en extensión de la GPU) se realice en el subproceso Render, en extensión de en el subproceso Main / UI.La única parte del proceso que puede incomunicar el hilo principal es RenderEffect
Créelo y aplíquelo al diseño: todas son tareas muy triviales en términos de procesamiento.
ininteligible
Comencemos con cómo realizar el desenfoque.Primero creamos el desenfoque RenderEffect
bu pira al método asombrado:
val blurEffect = RenderEffect.createBlurEffect (x, y, Shader.TileMode.MIRROR)
valencia Impacto de desenfoque = Impacto de renderizado.createBlurEffect(X, ÿ, Shader.Patrón de azulejería.espejo) |
Los dos primeros parámetros especifican la cantidad de desenfoque en los planos horizontal y erguido, respectivamente. Cuanto decano sea el valencia, más válido será el sorpresa de desenfoque. El tercer parámetro especifica cómo se renderizará el desenfoque cerca del borde. La documentación de la API de TileMode cubre varias opciones.
Podemos usar los títulos asimétricos de los componentes de desenfoque xey para crear algunos género diferentes. Por ejemplo, esta imagen tiene títulos de desenfoque xey uniformes, establecidos en 16 respectivamente.
Sin secuestro, si usamos un desenfoque de 16 x y un desenfoque de 0 ay, obtendremos un sorpresa completamente diferente, más parecido al desenfoque de movimiento horizontal.
Una vez que creamos un RenderEffect
Por ejemplo, podemos aplicarlo a la horizonte:
binding.image.setRenderEffect (sorpresa de desenfoque)
Amarrado.imagen.setRenderEffect(Impacto de desenfoque) |
Ese. En efectividad. ¿Recuerda lo que mencioné anteriormente acerca de que es una API muy simple y acomodaticio de usar?Todo lo que tenemos que hacer es crear un sorpresa y luego tocar setRenderNode()
alguna View
Apliquelo.
Subordinación
Otra característica extremadamente poderosa setRenderNode()
¿Está en el todo? View
Subordinación.Si tan solo ImageView
En el diseño, solo la imagen está borrosa:
Pero asimismo podemos cambiar a lo mismo blurEffect
Ejemplo de la horizonte raíz del diseño:
binding.root.setRenderEffect (sorpresa ininteligible)
Amarrado.raíz.setRenderEffect(Impacto de desenfoque) |
Si lo hace, afectará el diseño raíz y todo el diseño View
La grado debajo de ella.Nota: este diseño no incluye AppBar
.Eso es un sistema AppBar
, Por lo que no se aplica ningún desenfoque.Pero si lo haremos AppBar
En nuestro diseño, asimismo se aplicará el desenfoque.
En el código de muestra, Checkbox
La deducción denominada «Pantalla completa» contiene deducción para cambiar los género solo entre la imagen y el diseño completo.
Compatible con versiones anteriores
Estas API solo existen en API 31 y superior, y parece poco probable que sean compatibles con AndroidX. Sé que esto depende de algunos ganchos agregados a la canalización de renderizado de bajo nivel. Estos ganchos simplemente no existen en las primeras versiones de la plataforma Android, por lo que la biblioteca de AndroidX no tiene golpe a la API RenderNode de bajo nivel requerida para esto.
en conclusión
Esta es una API muy poderosa, muy limpia y acomodaticio de usar. No solo eso, asimismo tiene un parada rendimiento. Al ejecutar y probar el código de muestra, no pude detectar ningún retraso al cambiar el desenfoque.
Sin secuestro, a pesar de una pequeña cantidad de complejidad adicional, la API aún puede volverse más poderosa.En el próximo artículo, exploraremos este y otro sorpresa que podemos conseguir. RenderEffect
.
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 propagar este trabajo, visite http://blog.stylingandroid.com/license-information.