2012-08-17 17 views
13

アイテムが入ったListViewがあります。 ユーザーが項目をクリックすると、高さは0になり、下の項目は上にスクロールします。 以下のコードは動作しません。 私のコードでは、クリックされたアイテムは右にスケールされますが、下のアイテムは上にスクロールされず、同じ位置にとどまります。 私もLinearLayoutで試しましたが、同じ問題があります。ListViewは単一のアイテムをアニメーションします

この権利を行うアプリがあります。これはTasksと呼ばれています。

This little image should explain the problem

私の現在の実装では、次のようになります。

@Override 
public void onItemClick(AdapterView<?> arg0, View v, final int index, 
     long id) { 
    Animation anim = AnimationUtils.loadAnimation(getActivity(), 
      R.anim.scaleup); 
    v.startAnimation(anim); 
} 

<set android:shareInterpolator="false" > 
    <scale 
     android:duration="700" 
     android:fillAfter="false" 
     android:fillBefore="false" 
     android:fromXScale="1.0" 
     android:fromYScale="1.0" 
     android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
     android:pivotY="0%" 
     android:toXScale="1.0" 
     android:toYScale="0.0" /> 
</set> 

+1

現在の実装はどのように見えますか? – wsanville

+0

@ wsanvilleはソースを追加しました –

+0

それは本当にあなたが求めていることを理解するのが難しいです –

答えて

7

はここにあなたのlistadapterのnotifyDataSetChanged()メソッドを呼び出しますが、下にあるデータを格納どこから項目を削除し終わるまで私が作ったクラス(source I found hereから変更されたもの)は、あなたに必要な機能を与えるかもしれません。

public class FadeUpAnimation extends Animation { 

int mFromHeight; 
View mView; 

public FadeUpAnimation(View view) { 
    this.mView = view; 
    this.mFromHeight = view.getHeight(); 
} 

@Override 
protected void applyTransformation(float interpolatedTime, Transformation t) { 
    int newHeight; 
    newHeight = (int) (mFromHeight * (1 - interpolatedTime)); 
    mView.getLayoutParams().height = newHeight; 
    mView.setAlpha(1 - interpolatedTime); 
    mView.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; 
} 
} 

その後、これは私はあなたはそれがあなたのニーズに合わせて得ることができるかどうかを確認するためにそれで遊ぶことができ、それを

View tv = ... 
Animation a = new FadeUpAnimation(tv); 
a.setInterpolator(new AccelerateInterpolator()); 
a.setDuration(300); 
tv.setAnimation(a); 
tv.startAnimation(a); 

を使用している方法です。

+0

ねえ、これを使ってリスト項目を崩壊させていましたが、ユーザーが元に戻すときに戻るために項目が必要です。どのようにしてアニメーションを元に戻すことができますか?私は 'newHeight =(int)(mFromHeight *(1 + interpolatedTime));'を試してみました。マイナスを+に変更すると、奇妙な結果が出る – Zen

+0

'interpolatedTime'は0から1まで補間するので、' 0'を削除すると逆の効果が得られるはずです。また、ビューの自然な高さに初期化するには 'mFromHeight'(おそらく' mToHeight'に改名)を変更する必要があります。例えば'this.mToHeight = view.getMeasuredHeight();' – devnate

+0

1つのこと:heightが0に設定されていると、ビューは完全な高さになります(少なくとも私のコードでは)ので、 'mView.getLayoutParams()。height =数学max(newHeight、1); ' – bluewhile

0

のAndroidあなたが幅を変更すると、HTMLのように行動しない、高さビュー内の可視性、他のビューはそれらのポジションを更新しない。 これを行う必要がある場合は、すべてのリストビューとビューを個別に更新する必要があります。これは複雑なコードです。

+0

間違っています。あなたが@devnateで見ることができるように、Viewの境界の更新を非常にシンプルにすることができます。 – bluewhile

3

クリックしたアイテムをもう一度使用しますか?もしそうでなければ、あなたの可能性

  1. 待ちアニメーションが
  2. その後
+0

これは正しいです。 「onAnimationEnd」のアニメーションにアタッチされたアニメーションリスナを使用して、次に推奨するようにします。 –

+0

これは質問には答えません。ターゲットビューが何もスケールされていないため、下側のビューは上に移動せず、アニメーションが終了するとスナップインするだけです。 – Tom

関連する問題