android - ¿Por qué no funciona setVisibility después de que una vista está animada?
animation rotation (6)
Otra forma de evitar esto es envolver su vista animada en otra vista y establecer la visibilidad de esa vista de contenedor.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/animationHoldingFrame"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvRotate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rotate Me"
/>
</FrameLayout>
</LinearLayout>
Y el código luego se convierte en esto:
TextView tvRotate = (TextView) findViewById(R.id.tvRotate);
FrameLayout animationContainer = (FrameLayout)findViewById(R.id.animationHoldingFrame)
RotateAnimation r = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
r.setDuration(0);
r.setFillAfter(true);
tvRotate.startAnimation(r);
animationContainer.setVisibility(View.INVISIBLE);
¿Por qué la vista de texto no se vuelve invisible?
Aquí está mi diseño xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tvRotate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rotate Me"
/>
</LinearLayout>
..y aquí está mi actividad:
public class RotateMeActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tvRotate = (TextView) findViewById(R.id.tvRotate);
RotateAnimation r = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
r.setDuration(0);
r.setFillAfter(true);
tvRotate.startAnimation(r);
tvRotate.setVisibility(View.INVISIBLE);
}
}
Mi objetivo es rotar una vista y luego poder ocultarla y mostrarla en el código configurando setVisibility. Los siguientes trabajos funcionan, pero setRotation está disponible solo en API Nivel 11. Necesito una forma de hacerlo en API Nivel 10.
tvRotate.setRotation(180);//instead of the RotateAnimation, only works in API Level 11
tvRotate.setVisibility(View.INVISIBLE);
Para mí, llamar a clearAnimation
of the View solucionó el problema. En mi caso, quise volver a colocar la vista en su posición original después de hacer una traducción con fillAfter set to true.
Se me ocurrió una solución para esto: básicamente justo antes de llamar a setVisibility (View.GONE), haga una animación con duración = 0 setFillAfter (false) y tenga el ángulo desde / para establecer el ángulo de rotación actual.
Esto borrará el mapa de bits setFillAfter y permitirá que la vista desaparezca.
Terminé requiriendo API Nivel 11 y usando setRotation para lograr esto. Esto parece ser un requisito bastante simple que no se puede hacer antes de Honeycomb. Todo lo que quería hacer era girar un botón y luego ocultarlo / mostrarlo.
Todas las animaciones (antes de Android 3.0) en realidad se aplican a un mapa de bits que es una instantánea de su vista en lugar de su vista original. Cuando configura el relleno después de verdadero, significa que el mapa de bits continuará mostrándose en la pantalla en lugar de su vista. Esta es la razón por la cual la visibilidad no cambiará al usar setVisibility
y también la razón por la cual su vista no recibirá eventos táctiles en sus nuevos límites (rotados). (pero como estás girando en 180 grados eso no es un problema).
Use esto antes de setVisibility una vez completada la animación:
anim.reverse();
anim.removeAllListeners();
anim.end();
anim.cancel();
donde anim es tu ObjectAnimator
pero si estás usando la clase de Animación, simplemente hazlo:
view.clearAnimation();
en la vista en la que se realizó la animación