2015-08-01 8 views
12

Sto tentando di animare una vista a un altro layout, ma ho riscontrato un problema, perché la mia vista è dietro il layout. Ho provato a mettere android:animateLayoutChanges="true", ma senza successo.
Il mio codice:
layout.xmlVisualizza animate andando dietro altri layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true"> 
    <RadioButton 
     android:id="@+id/radioButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New RadioButton" /> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_margin="20dp" 
     android:animateLayoutChanges="true" 
     android:background="#ffffff"> 

    </LinearLayout> 
</RelativeLayout> 

La mia classe activicty:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 

     float x = 300; 
     float y = 300; 
     RadioButton button = (RadioButton) findViewById(R.id.radioButton); 
     button.animate().setDuration(10000).x(x).y(y); 
    } 
} 
+0

Il LinearLayout è sopra la RadioButton. – ElDuderino

+0

Con "in un altro layout" intendi che vuoi che il tuo 'RadioButton' diventi figlio del tuo' LinearLayout'? – tachyonflux

+0

Sì, ma non dimenticare che voglio l'animazione. Quindi, per passare da un layout all'altro – user1851366

risposta

9

Gli articoli saranno disegnate nello stesso ordine in cui sono ordinate nel layout. Per il tuo layout, il RadioButton verrà disegnato prima e poi il LinearLayout. Se si sovrappongono, il LinearLayout verrà disegnato su RadioButton.

Soluzione Parte # 1: capovolgere l'ordine di RadioButton e LinearLayout in modo che il RadioButton è sempre disegnato scorso.

<RelativeLayout 
    android:id="@+id/final_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="30dp" 
    android:background="#ffffff"> 
</RelativeLayout> 

<RadioButton 
    android:id="@+id/radioButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New RadioButton" /> 

Una spiegazione più rigorosa sul Android Developer's site.

Soluzione numero 2: Non correlato al punto sopra riportato ma probabilmente ugualmente importante, è necessario avviare l'animatore. Fonte aggiornata:

public class MainActivity extends AppCompatActivity { 

    private RadioButton mRadioButton; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mRadioButton = (RadioButton) findViewById(R.id.radioButton); 
    } 

    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 

     float x = 300; 
     float y = 300; 

     ViewPropertyAnimator animator = mRadioButton.animate().setDuration(10000).x(x).y(y); 
     animator.setListener(new Animator.AnimatorListener() { 
      @Override 
      public void onAnimationStart(Animator animation) {} 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       Log.d(TAG, "onAnimationEnd"); 
      } 

      @Override 
      public void onAnimationCancel(Animator animation) {} 
      @Override 
      public void onAnimationRepeat(Animator animation) {} 
     }) 
     animator.start(); 
    } 

    private static final String TAG = MainActivity.class.getSimpleName(); 
} 

Testato, animato all'avvio dell'app in Android 5.1.

1

io non sono sicuro di quello che si sta cercando di raggiungere, ma se si sta spostando un bambino View fuori il suo contenitore è necessario disabilitare le clipToChilder e clipToPadding attributi sul contenitore, al fine di vedere il bambino si muove al di fuori del genitore :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clipChildren="false" 
     android:clipToPadding="false"> 
     ... 
    </RelativeLayout> 

in ogni caso, se si verificano ordine z problema su alcuni vista è possibile utilizzare il metodo bringToFront(); nel tuo caso:

final RadioButton button = (RadioButton) findViewById(R.id.radioButton); 
    button.animate().setDuration(10000).x(x).y(y).setListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationStart(Animator animator) { 
     } 

     @Override 
     public void onAnimationEnd(Animator animator) { 
      button.bringToFront(); 
     } 

     @Override 
     public void onAnimationCancel(Animator animator) { 
     } 

     @Override 
     public void onAnimationRepeat(Animator animator) { 
     } 
    }); 
1

Sulla base del commento di Sir Karaokyo che avete risposto ad allora vi consiglio questo è ciò che si vuole

RadioButton r1; // suppose you already referenced it 
LinearLayout l1; // // 
Animation anim = AnimationUtils.loadAnimation(getBaseContext(), R.anim.abc_slide_in_top); 
// the R.anim. blah blah is the preferred animation you want 
//when the time comes 
if(r1.getParent() != null) 
    ((ViewGroup)r1.getParent()).removeView(r1); 
l1.addView(r1); 
r1.startAnimation(anim); 
// you can create an animation listener and add the view when the animation 
//starts 

La cattura è, sarà simile al modo in cui si voleva esso.

5

Basta dare tutto xml proprietà elemento layout android:clipChildren="false" & android:clipToPadding="false". e non dimenticarti di fare animatedView.bringToFront()

hanno lo stesso problema prima del mese e trovato la soluzione dopo aver lavorato un paio di giorni. trova la mia coda here

1

La soluzione più semplice è provare a eseguire il relayout in xml in modo che RadioButton venga visualizzato dopo LinearLayout.

chiamata bringchildTofront (yourradiobutton) prima di iniziare l'animazione o Se si desidera un maggiore controllo sul l'ordine di disegno quindi estendere RelativeLayout e sovrascrivere

protected int getChildDrawingOrder (int childCount, int i) 
2

Mi permetta di fornire la soluzione rispetto alla 480x854 pixel dello schermo MDPI

480X854 pixel screen

Scenario 1: Si desidera RadioB per attraversare LinearLayout con RelativeLayout come ViewGroup padre rispetto a devi correggere il tuo ordine z. Fai le modifiche come sotto il layout. L'animazione inizia dal punto A (0,0) al punto C (300,300) del RelativeLayout.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_margin="20dp" 
     android:background="#ffffff"> 
    </LinearLayout> 

    <RadioButton 
     android:id="@+id/radioButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New RadioButton" 
    /> 
</RelativeLayout> 

Scenario 2: Si vuole RadioButton per animare il LinearLayout con LinearLayout come ViewGroup genitore che è necessario impostare il layout, come di seguito. L'animazione inizia dal punto B (20,20) (come per il valore layout_margin) al punto D (320.320) del RelativeLayout.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_margin="20dp" 
     android:background="#ffffff"> 

     <RadioButton 
      android:id="@+id/radioButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="New RadioButton" 
     /> 
    </LinearLayout> 

</RelativeLayout> 

Scenario 3: Si vuole RadioButton per animare tutto il LinearLayout con LinearLayout come genitore ViewGroup e la vostra x o il valore y va oltre la dimensione confini LinearLayout in entrambe le direzioni per esempio x = 800> 480 pixel o Y = 1200> 854 pixel

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    <!-- Allow all the children to go out of their parent boundaries --> 
    android:clipChildren="false" 
> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="20dp" 
    <!-- Allow all the children to go out of their parent boundaries --> 
    android:clipChildren="false" 
    <!-- Do not clip the children at the padding i.e. allow to children go 
    beyond the padding --> 
    android:clipToPadding="false" 
    android:background="#ffffff"> 

    <RadioButton 
     android:id="@+id/radioButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New RadioButton" 
     /> 
    </LinearLayout> 

</RelativeLayout> 

Mi auguro che aiuta ...
Felice di codifica ...