2011-11-09 11 views
33

これを行う方法の良い例が見つかりませんでした。アニメーションでレイアウトの高さを拡張する方法は?

xの高さでRelativeLayoutが設定されています。

x + yの高さに高さを拡大するボタンを追加したいと思います。

誰かがプログラムでそれを行う方法の良い例を紹介してくれますか?

+0

私は展開したり折りたたんだり解決のため、ここでチェック: http://stackoverflow.com/questions/20973089/android-add-view-with-expand-アニメーションのない点滅 –

+0

http://stackoverflow.com/a/8162779/5996106ベストソリューション –

答えて

12

ある公式ドキュメント

である必要があります。しかしここでは正確な新しい高さを知る必要があります。

public class LayoutAnimationActivity extends Activity 
{ 
    RelativeLayout ril1; 
    Button btn; 
    int initialHeight; 
    int actualHeight; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main2); 
     ril1=(RelativeLayout)findViewById(R.id.relativeLayout1); 
     btn=new Button(this); 
     btn.setWidth(100); 
     btn.setHeight(200); 
     btn.setText("Button"); 
     actualHeight=210; 
     Ani a=new Ani(); 
     a.setDuration(2000); 
     ril1.startAnimation(a); 
    } 

    class Ani extends Animation 
    { 
     public Ani() { 
     } 

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

      newHeight = (int)(initialHeight * interpolatedTime); 

      ril1.removeAllViews(); 
      btn.setWidth(100); 
      btn.setHeight(300); 
      btn.setText("as"); 
      ril1.addView(btn);    
      ril1.getLayoutParams().height = newHeight; 
      ril1.requestLayout(); 
     } 

     @Override 
     public void initialize(int width, int height, int parentWidth, int parentHeight) { 
      super.initialize(width, height, parentWidth, parentHeight); 
      initialHeight = actualHeight; 
     } 

     @Override 
     public boolean willChangeBounds() { 
      return true; 
     } 
    }; 
} 
+0

よくレイアウトを拡張しましたが(私はいくつかの変更を行いました)、アニメーションはありません – piojo

+0

今すぐ確認してください..回答が編集されました – Maneesh

+1

ボタンはこれで何をするのか分かりません。なぜremoveAllViewとボタンに新しい幅、高さ、テキストを設定します。このコードはレイアウトを拡大するだけですが、どうやって折り畳まれますか? – piojo

15

あなたは、スケールアニメーションhereは、以下のように新しい編集した答えの下に確認してください、これはコードで

private void animate() { 
    ImageView imageView = (ImageView) findViewById(R.id.ImageView01); 
    ScaleAnimation scale = new ScaleAnimation((float)1.0, (float)1.5, (float)1.0, (float)1.5); 
    scale.setFillAfter(true); 
    scale.setDuration(500); 
    imageView.startAnimation(scale); 
} 
+0

スケーリング?私は翻訳が必要だと思った。私はLayoutParamsを調整しています、あなたはスケーリングが必要ですか? – piojo

+2

サイズを大きくしたい場合は、スケーリングが必要です。あなただけのものを移動したい場合は、翻訳が必要です。 – Janusz

+0

申し訳ありませんが、私は高さと高さの開始を取得するスケールアニメーションが必要です。どのくらいスケールする必要はありません – piojo

45

最も近い解決策をマークしました。これは正確な解決策です。私も同じ問題がありました。うまくいけば、この答えは他の人に役立つでしょう。

1)あなたのXMLレイアウトファイルでandroid:animateLayoutChanges="true"を設定します。

インスタンス化ResizeAnimation

ResizeAnimation resizeAnimation = new ResizeAnimation(
    view, 
    targetHeight, 
    startHeight 
); 
resizeAnimation.setDuration(duration); 
view.startAnimation(resizeAnimation); 

ResizeAnimationクラスはAnimationクラスせずにこれを行うには、この

public class ResizeAnimation extends Animation { 
    final int targetHeight; 
    View view; 
    int startHeight; 

    public ResizeAnimation(View view, int targetHeight, int startHeight) { 
     this.view = view; 
     this.targetHeight = targetHeight; 
     this.startHeight = startHeight; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     int newHeight = (int) (startHeight + targetHeight * interpolatedTime); 
     //to support decent animation, change new heigt as Nico S. recommended in comments 
     //int newHeight = (int) (startHeight+(targetHeight - startHeight) * interpolatedTime); 
     view.getLayoutParams().height = newHeight; 
     view.requestLayout(); 
    } 

    @Override 
    public void initialize(int width, int height, int parentWidth, int parentHeight) { 
     super.initialize(width, height, parentWidth, parentHeight); 
    } 

    @Override 
    public boolean willChangeBounds() { 
     return true; 
    } 
} 
+17

ありがとう!私はちょうどdescent heightアニメーションもサポートするようにnewHeight計算を修正しました!int newHeight =(int)(startHeight +(targetHeight - startHeight)* interpolatedTime); –

+0

魅力的な作品です。ありがとうございました。 – GrafOrlov

+0

摺動遷移を行わない – iYonatan

2

つの簡単な方法のようになります。

2)ViewPropertyアニメーター

layout.setPivot(0); 
layout.animate().scaleY(scaleFactor).setDuration(500); 

を使用してピボットから拡張するビューを指示し、デフォルトでは、私の経験で何をしたいなることはほとんどありませんされ、真ん中にあります。期間はオプションです(デフォルト= 1000)。

1
final Button button1 = (Button) view.findViewById(R.id.button); 
    final CollapseAnimator animator = new CollapseAnimator(topLayout); 

    final ViewTreeObserver.OnGlobalLayoutListener listener = new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int mHeight = button1.getMeasuredHeight(); 
      KLog.i("onGlobalLayout() mHeight:" + mHeight); 
      animator.setValues(mHeight*2, mHeight); 

     } 
    }; 
    button1.getViewTreeObserver().addOnGlobalLayoutListener(listener); 
    button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      view.post(new Runnable() { 
       @Override 
       public void run() { 
        button1.getViewTreeObserver().removeOnGlobalLayoutListener(listener); 
        animator.collapse(); 

       } 
      }); 

     } 
    }); 

とクラス

public class CollapseAnimator { 
    private View view; 
    private boolean collapse=true; 
    private int duation=300; 
    private int destHeight=300; 
    private ValueAnimator animator; 
    private int originHeight=0; 
    private int from=0; 
    private int to=0; 


    public CollapseAnimator(View view) { 
     this.view = view; 
    } 

    public void setValues(int destHeight,int originHeight){ 
     this.destHeight = destHeight; 
     this.originHeight=originHeight; 
     from=originHeight; 
     to=originHeight; 
    } 
    public void collapse(){ 


     from=to; 
     if(collapse){ 

      to=destHeight; 
      collapse=false; 
     }else{ 
      to=originHeight; 
      collapse=true; 
     } 
     KLog.i("from:" + from+",to:"+to); 
     animator = ValueAnimator.ofInt(from, to); 
     animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator valueAnimator) { 
       int val = (Integer) valueAnimator.getAnimatedValue(); 
       ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
       layoutParams.height = val; 
       view.setLayoutParams(layoutParams); 
      } 
     }); 
     animator.setDuration(duation); 
     animator.start(); 
    } 
} 
関連する問題