2011-01-27 40 views
19

¿Es posible establecer y obtener la alfa/opacidad de un diseño y todas sus vistas secundarias? No estoy hablando del trasfondo. Digamos una colección de controles de video como Play, Pausa y Progressbar en un diseño relativo.Establecer alfa/opacidad del diseño

Puedo usar la animación para desvanecerme y desaparecer, pero quería saber si había un método directo que pudiera usar.

Respuesta

59

Puede establecer el alfa en el diseño y sus elementos secundarios (o cualquier otra vista para el caso) usando AlphaAnimation con 0 duración y la opción SetFillAfter.

Ejemplo:

AlphaAnimation alpha = new AlphaAnimation(0.5F, 0.5F); 
alpha.setDuration(0); // Make animation instant 
alpha.setFillAfter(true); // Tell it to persist after the animation ends 
// And then on your layout 
yourLayout.startAnimation(alpha); 

Puede utilizar una animación para múltiples componentes para ahorrar memoria. Y reinicie() para volver a usar, o borre la animación() para soltar alfa.

Aunque parece crudo y pirateado, en realidad es una buena manera de establecer alfa en un conjunto de vistas que no requiere mucha memoria o tiempo de procesador.

Sin embargo, no estoy seguro acerca de obtener el valor alfa actual.

+0

Gracias. Estaba usando animación, pero estaba configurando la visibilidad del objeto una vez que se completó la animación en lugar de utilizar el método setFillAfter. –

+0

Parece romper las animaciones (si se ejecuta durante la animación). ¿Alguna solución para esto? – Sufian

+0

Como solución alternativa, utilicé una imagen semitransparente configurada como fondo de una 'Vista'. – Sufian

6

La solución de Alex funciona, pero otra forma es crear una vista personalizada que invoque Canvas.saveLayerAlpha() antes de dibujar sus elementos secundarios. Tenga en cuenta que en Android 3.0 hay una nueva View.setAlpha() de la API :)

+0

Gracias, esperando el método setAlpha. Algo que más uso de otros idiomas. –

15

Aquí es un método que funciona en todas las versiones (thanks to @AlexOrlov):

@SuppressLint("NewApi") 
public static void setAlpha(View view, float alpha) 
{ 
    if (Build.VERSION.SDK_INT < 11) 
    { 
     final AlphaAnimation animation = new AlphaAnimation(alpha, alpha); 
     animation.setDuration(0); 
     animation.setFillAfter(true); 
     view.startAnimation(animation); 
    } 
    else view.setAlpha(alpha); 
} 

Claramente, para que la API de menos de 11 si puede crear una vista personalizada que llame al antes de dibujar sus elementos secundarios (thanks to @RomainGuy).

+0

Esto es perfecto, gracias – Selecsosi

+0

Gracias Takhion. Agregar @SuppressLint ("NewApi") :) – Nifhel

+0

Usar: ViewCompat.setAlpha (Ver, flotar). – TomerBu

3

Ahora puede usar ViewCompat.setAlpha(View, float) para esta acción.

+0

Cita del documento: "* Antes de la API 11 esto no tendrá ningún efecto. *" – Pang

+0

no existe dicho método. He establecido una API mínima establecida en 11. Pero tiene el método ViewCompat.getAlpha (anyView) –

0

Lo siento por mi respuesta, pero si desea que el alfa puede utilizar la clase ViewCompat

ViewCompat.setAlpha (Ver vista, flotar alfa)

ViewCompat se encuentra en la v4 appcompat

Cuestiones relacionadas