2011-12-13 11 views
8

私はViewGroupに基づいてウィジェットを開発しています。問題はアニメーションの終了後にアイテムの位置を保存する必要があることです。アニメーションオブジェクト内にsetFillAfter(true)を呼び出しました。AnimationListenerを作成しました。onAnimationEndメソッドコールView.layout(l,t,r,b)でアニメーションの後に位置を設定すると、次回新しいアイテムの位置からアニメーションを開始します。しかし、この場合は、アイテムが2回レイアウトされているように見えます。アニメーションの最後にView.layout(l,t,r,b)を使用しないと、次のアニメーションは前の位置から開始します。ここに私のコードです:アニメーションの終了後の位置の変更

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillAfter(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

アニメーションの終了位置に応じてビューの位置をリセットする方法を教えてください。

+0

変更するよりも、一例であり、表示位置が自動変更しますpositionは、レイアウトのBOTTOMまたはTOPに設定することを意味します。 –

+0

はBOTTOMまたはTOPではありませんが、具体的なX、Y座標は 'view.lay out() 'メソッド – teoREtik

答えて

12

私はそれをしました。

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillEnabled(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

ちょうど setFillAfter(true)を削除し、代わりに setFillEnabled(true)を記述します。ここでは、コードです。しかし、この場合は、 setFillEnabled()のロジックが理解できません。これは、ドキュメンテーションのような動作を提供しないためです。

+0

onAnimationEndの新しい左辺を設定することで問題が修正されました。ありがとう。あなたのコードでは、どの時点でmOffsetBetweenItemsが設定/更新されますか? – speedynomads

+0

注:少なくともLollipopでは動作しません(いくつかのAPIレベルで推測すると上のように実装されましたが、少なくともLollipopでは動作しません) – MDragon00

0

アニメーションを反転させます。ビューを新しい位置に与えてから、元の位置から新しい位置にアニメートします。

+0

私は最初に新しい位置を与えると、新しい位置に自分のビューを即座に再描画します – teoREtik

+0

位置を変更するとすぐにstartAnimation()を呼び出す場合はしません。 – Jave

+0

'view.layout()'を 'view.startAnimation()'の前に呼び出すとビューが再描画され、アニメーションは新しい位置から始まります。 – teoREtik

19

ObjectAnimatorを使用する必要があります。これはAPI 11レベルで動作します。ここは

アプリがobject animatorを見つけていない場合は、Project -> properties -> AndroidからAPIレベルを変更する7月彼のanswer

ため

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX); 
objectAnimator.setDuration(1000); 
objectAnimator.start(); 

おかげでimport android.animation.ObjectAnimator;

+0

ビューをアニメーション化します。ビューの座標はオブジェクトアニメーターでは変更されません。 – mertsimsek