2012-10-26 23 views
11

非常に単純な表現で問題を再現しました。私は3 TextViewsがあります。そのうち2つは別々のLinearLayoutにあり、3番目のものはLinearLayoutと同じレベルにあります。 私はtest1test2の可視性を切り替えているので、それらが消えていくのを見たいと思います。さらに、test3を新しい場所にスライドさせたい(test1test2の代わりに)。私はこれを実現させることはできません。 test3は新しいポイントにちょうどスナップします。LayoutTransition:拡大表示の横にアニメーション表示

どうすればこの問題を解決できますか?

マイコード:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/parent" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:animateLayoutChanges="true" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click" /> 

    <LinearLayout android:animateLayoutChanges="true" 
     android:id="@+id/child1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/test1" 
      android:layout_width="match_parent" android:visibility="gone" 
      android:layout_height="wrap_content" 
      android:text="TEST1" /> 

     <TextView 
      android:id="@+id/test2" 
      android:layout_width="match_parent" android:visibility="gone" 
      android:layout_height="wrap_content" 
      android:text="TEST2" /> 
    </LinearLayout> 

    <TextView 
     android:id="@+id/test3" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="TEST3" /> 

</LinearLayout> 

そして、私の活動で:

public class LayoutAnimations extends Activity { 
    private boolean toggle = true; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_animations); 

     Button button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (toggle) { 
        findViewById(R.id.test1).setVisibility(View.VISIBLE); 
        findViewById(R.id.test2).setVisibility(View.VISIBLE); 
       } else { 
        findViewById(R.id.test1).setVisibility(View.GONE); 
        findViewById(R.id.test2).setVisibility(View.GONE); 
       } 
       toggle = !toggle; 
      } 
     }); 

    } 

} 

編集:私は実際に持っている別のTextViewtest1に、常に表示されている必要がありtest2ので、私LinearLayout自体を隠すことはできません。

答えて

6

代わりにテキスト3のchild1のでアニメーションを添付しました、私は他の質問を使用して、それを解決してきました。 See this answer

は引用:

を私は最も簡単な方法は、Animationクラスを拡張し、次のようにビューの高さを変更するapplyTransformation()をオーバーライドすることであると信じて:

import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.view.animation.Animation; 
import android.view.animation.Transformation; 
import android.widget.LinearLayout; 

public class MyCustomAnimation extends Animation { 

    public final static int COLLAPSE = 1; 
    public final static int EXPAND = 0; 

    private View mView; 
    private int mEndHeight; 
    private int mType; 
    private LinearLayout.LayoutParams mLayoutParams; 

    public MyCustomAnimation(View view, int duration, int type) { 

     setDuration(duration); 
     mView = view; 
     mEndHeight = mView.getHeight(); 
     mLayoutParams = ((LinearLayout.LayoutParams) view.getLayoutParams()); 
     mType = type; 
     if(mType == EXPAND) { 
      mLayoutParams.height = 0; 
     } else { 
      mLayoutParams.height = LayoutParams.WRAP_CONTENT; 
     } 
     view.setVisibility(View.VISIBLE); 
    } 

    public int getHeight(){ 
     return mView.getHeight(); 
    } 

    public void setHeight(int height){ 
     mEndHeight = height; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 

     super.applyTransformation(interpolatedTime, t); 
     if (interpolatedTime < 1.0f) { 
      if(mType == EXPAND) { 
       mLayoutParams.height = (int)(mEndHeight * interpolatedTime); 
      } else { 
       mLayoutParams.height = (int) (mEndHeight * (1 - interpolatedTime)); 
      } 
      mView.requestLayout(); 
     } else { 
      if(mType == EXPAND) { 
       mLayoutParams.height = LayoutParams.WRAP_CONTENT; 
       mView.requestLayout(); 
      }else{ 
       mView.setVisibility(View.GONE); 
      } 
     } 
    } 
} 

それを使用するには、次のようにあなたのonclick()を設定します。

int height; 

@Override 
public void onClick(View v) { 
    if(view2.getVisibility() == View.VISIBLE){ 
     MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyAnimation.COLLAPSE); 
     height = a.getHeight(); 
     view2.startAnimation(a); 
    }else{ 
     MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyAnimation.EXPAND); 
     a.setHeight(height); 
     view2.startAnimation(a); 
    } 
} 

よろしくお願いいたします。

1

使用このアニメーションXML slide_in_left.XML

<translate 
    android:duration="500" 
    android:fromXDelta="-100%" 
    android:fromYDelta="0%" 
    android:toXDelta="0%" 
    android:toYDelta="0%" /> 
</set> 

とslid_in_right.XML

<translate 
    android:duration="500" 
    android:fromXDelta="100%" 
    android:fromYDelta="0%" 
    android:toXDelta="0%" 
    android:toYDelta="0%" /> 
</set> 

使用このアニメーション アニメーションslideinleft、slideinright。

と、このアニメーションに

public void AnimationInitialization() { 

    slideinleft= AnimationUtils 
      .loadAnimation(this, R.anim.slide_in_left); 


    slideinright= AnimationUtils.loadAnimation(this, 
      R.anim.slide_in_right); 

} 

をinitlize、あなたが必要とするあなたがレイアウトを変更することができますvisibilty

public void showMenu() { 

    linearlayout_first.clearAnimation(); 

    linearlayout_first.startAnimation(slideinleft); 

    linearlayout_first.setVisibility(View.VISIBLE); 

} 

public void hideMenu() { 

    linearlayout_second.clearAnimation(); 
    linearlayout_second.startAnimation(slideinright); 


    linearlayout_second.setVisibility(View.GONE); 
} 

を変更するため、この2関数を呼び出します。アニメーションXMLのXdeltaとYdeltaでも が変化します。

+0

AnimationListenerを使用しないと、消滅したビューのアニメーションは機能しません。このためには、AnimationListenerをアタッチし、onAnimationEnd()でSetVisibility(View.GONE)を指定する必要があります。 – gauravsapiens

+0

私はこのコードを使って作業しています...それは私のためには大丈夫です.. –

+0

ビューを表示してからアニメーションします。私の経験から、それは本当にスケッチに見えました。 – Michael

0

ドキュメントはちょっと混乱します。 android:animateLayoutChangesのために、それは

を言う...このフラグをtrueに設定すると、デフォルトのLayoutTransitionオブジェクトはのViewGroupコンテナに設定され、これらのレイアウトの変更が発生した場合、デフォルトのアニメーションが実行されます。

のViewGroupクラスのsetLayoutTransition方法のドキュメントは言いながら:デフォルト

、遷移オブジェクトは、(SOレイアウト変更が がアニメーション化されていない)はnullです。

レイアウトにLayoutTransitionを設定してください。ここで

はそれを行う例..ですhttp://www.java2s.com/Code/Android/UI/UseLayoutTransitiontoautomatetransitionanimationsasitemsarehiddenorshowninacontainer.htm

+0

私はこれを最初に試しました。私の2番目の試みは実際にxmlに移動しました。 – nhaarman

3

私は私のアプリで発生する同じことを望んでいました。これを達成するには

  1. Res/animで適切なアニメーションを作成します。私は左の種類のアニメーションからスライドを使いました。あなたはこれに満足していない場合、他のGoogleをすることができます。

    slide_out_left.xml

    <translate 
        android:duration="@android:integer/config_mediumAnimTime" 
        android:fromXDelta="0" 
        android:toXDelta="-50%p" /> 
    
    <alpha 
        android:duration="@android:integer/config_mediumAnimTime" 
        android:fromAlpha="1.0" 
        android:toAlpha="0.0" /> 
    

  2. (テキスト1とテキスト2を含むあなたのケースのchild1の中で)、

    Animation outAnimation; 
    LinearLayout a1 = (LinearLayout)findViewById(R.id.child1); 
    
    outAnimation = (Animation) AnimationUtils.loadAnimation (getApplicationContext(), R.anim.slide_out_left); 
    
    a1.setAnimation(outAnimation); 
    outAnimation.setAnimationListener(new AnimationListener() { 
    
        @Override 
        public void onAnimationEnd(Animation arg0) { 
        a1.setVisibility(View.GONE);        
        } 
        @Override 
        public void onAnimationRepeat(Animation animation) { 
         // TODO Auto-generated method stub       
        } 
    
        @Override 
        public void onAnimationStart(Animation animation) { 
         // TODO Auto-generated method stub 
        }     
    }); 
    a1.startAnimation(outAnimation); 
    
  3. をアニメーション化したいビューの上で定義されたアニメーションを添付

NOTE:child1のは、ゆっくりと引き出します時に自動的にテキスト3の中にスライドされていることを錯覚を与えるので私は

関連する問題