2011-12-31 14 views
55

Perché il testo non diventa invisibile?Perché la funzione setVisibility non funziona dopo che una vista è stata animata?

Ecco il mio layout 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> 

..e qui è la mia attività:

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); 
    } 
} 

Il mio obiettivo è quello di ruotare la vista e quindi in grado di nascondere e mostrare nel codice impostando setVisibility. Le seguenti opere, ma setRotation è disponibile solo nel livello API 11. Ho bisogno di un modo per farlo in Livello API 10.

tvRotate.setRotation(180);//instead of the RotateAnimation, only works in API Level 11 
tvRotate.setVisibility(View.INVISIBLE); 

risposta

18

Tutte le animazioni (prima Android 3.0) vengono effettivamente applicate a una bitmap che è un istantanea della tua vista anziché sulla tua vista originale. Quando si imposta il riempimento dopo true questo in realtà significa che la bitmap continuerà a essere visualizzata sullo schermo invece della vista. Questo è il motivo per cui la visibilità non cambierà con l'utilizzo di setVisibility e anche il motivo per cui la vista non riceverà gli eventi di tocco nei suoi nuovi limiti (ruotati). (ma visto che stai ruotando di 180 gradi non è un problema).

+1

quindi, c'è un modo per nascondere la b itmap che persiste dopo la rotazione? – ZippyFerguson

+0

stesso problema ... – SunnySonic

1

Ho finito per richiedere il livello API 11 e l'utilizzo di setRotation per ottenere ciò. Questo sembra un requisito piuttosto semplice che non può essere fatto pre-Honeycomb però. Tutto quello che volevo fare era ruotare un pulsante e poi nasconderlo/mostrarlo.

1

Mi è venuta una soluzione per questo: in pratica prima di chiamare setVisibility (View.GONE), fare un'animazione con duration = 0 setFillAfter (false) e avere l'angolo da/per impostare l'angolo di rotazione corrente .

Questo cancellerà la bitmap setFillAfter e consentirà la visualizzazione della vista.

7

Un altro modo per ovviare a questo è avvolgere la vista animata in un'altra vista e impostare la visibilità di tale vista del wrapper.

<?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> 

E il codice diventa allora questo:

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); 
+0

Esattamente quello che stavo cercando :-) – Couitchy

151

per avermi chiamato clearAnimation della visualizzazione risolto il problema. Nel mio caso ho voluto riportare la vista nella sua posizione originale dopo aver eseguito una traduzione con fillAfter impostato su true.

+6

Stavo avendo questo problema e posso confermare che clearAnimation fa il trucco. –

+0

per favore qualcuno accetti questa risposta dato che è quella che salva il tuo a ** dopo DAYS di difficoltà;) thx! –

+4

Confermo che questo risolve il problema.Per essere più utile usalo in 'onAnimationEnd()' in 'AnimationListener';) – czaku

5

Utilizzare questo prima setVisibility dopo l'animazione è stata completata:

anim.reverse(); 
anim.removeAllListeners(); 
anim.end(); 
anim.cancel(); 

dove anim è il vostro ObjectAnimator

ma se si utilizza la classe Animazione, quindi basta fare:

view.clearAnimation(); 

su la vista su cui è stata eseguita l'animazione

Problemi correlati