2013-04-08 22 views
40

グリッドに動的に追加または削除できるレイアウトのGridViewがあります。Android:GridViewコンテンツの変更をアニメーション化する

GridViewアイテムのネイティブ動作は、グリッド内の他のアイテムが削除されたアイテムの場所にスライドするか、スライドして新しいアイテムが追加されたときに空きができるようにすることです。

しかし、Androidでは、変更が画面上に瞬時に反映されます。私は、GridViewのアダプターでいくつかのトリックを使用して、各getViewメソッド()の呼び出しにカスタムアニメーションを追加しようとしたが、それはここに見られるいくつかの問題を引き起こしてしまった:

Android GridView loading the 0 indexed item in a later index's slot when data set changes

私は個々のビューが代わりにアニメーションを制御持ってみましたアダプターのgetView()メソッドが終了しましたが、最終結果は同じでした。

私はまた、このように、GridLayoutAnimationControllerを使用してみました:

Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein); 
GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f); 
mGrid.setLayoutAnimation(controller); 

これは、すべてのGridViewのコンテンツの初期負荷で動作しますが、それは、デフォルトではないようにそのコンテンツへの変更だけで、瞬時でポップ。

これはかなりシンプルな機能だと思うし、もっと簡単な方法があるはずです。私がオンラインで検索した中で最高ののは、グリッド内の場所を入れ替えるGridViewアイテムをアニメーション化するa libraryですが、これは私が探しているものではありません(同じライブラリで、削除によってグリッドからアイテムを削除すると私が避けようとしているのと同じインスタントエフェクトが発生します)。

私も見てきた共通の答えは、「APIDemosを見てください、たくさんの例があります。しかし、わかっている限り、実際にはGridViewコンテンツのアニメーション化の例はありません。

ご協力いただきありがとうございます。

+1

追加するアニメーションのタイプは何ですか? xmlプロパティー "animateLayoutChanges = true"を追加すると、ほぼすべてのビューに基本的な流体アニメーションが提供されます。 – klmprt

+1

これは私が試した最初のものであり、残念なことに動作しません。 – JMRboosties

+0

5月、私はこのアニメーションを停止する方法を知っています。 –

答えて

7

チェットハーゼが正しくリストビューアニメーションを処理する方法の素敵な映像で出てきました。基本概念はGridViewに適用できます。あなたはビデオhereを見つけることができます。

API 1.0+用に開発している場合、NineOldAndroidsを使用しない限り、動画に参照される参照されるアニメーション機能(ViewPropertyAnimatorなど)を使用することはできません。

2

私はうまくいけば、これは助けることができる、そのようなのLinearLayout等: http://developer.android.com/training/animation/layout.html として他のレイアウトビューのアニメーションに対処するため、このリソースリンクは非常に役に立つことがわかりました。 また、からインスピレーションを受けることもできます。

4

私はAdapterViewについて、ViewGroupのLayoutTransitionは機能しないと考えています。ソースコードを見ると、のViewGroupは他の子供たちの遷移アニメーションがaddViewremoveViewへの呼び出しのために起こる保証しますが、それはビューを供給するためのアダプタに依存しているため、派生AdapterViewは、これらのメソッドを使用していません。上記

チェットハーゼの映像が消えているリストビューの単一の子ビューをアニメーション化するのではなく、ギャップを埋めるために移動し、他のすべての周りの子ビューをアニメーション化についてです。

私が正しく理解している場合、GridLayoutAnimationControllerは、子どもが入力する際に​​(つまり、空から始まってリスト全体を完全に再レイアウトして初めて)、互い違いのアニメーションを作成します。追加または削除後の周囲の子供のレイアウト変更を配置します。子供たちは、最初から最後まで、いつでも1つずつ、フェージングやスライドイン、スピンアップで現れますか?

最後に、推奨される解決策:アダプタベースのビューが不要な場合は、GridLayoutまたはLinearLayoutに切り替えることができます。それはanimateLayoutChanges="true"が動作する場所と、「レイアウトアニメーション」デモが常に使用するものです。 注意LayoutTransitionには最低限のAPIレベル11が必要です。また、GridLayoutにはapi14が必要です。

4

.remove() のようにGridViewを変更した後は、mGrid.startLayoutAnimation();を呼び出す必要があります。

GridViewは自動的には行いません。手動で起動する必要があります;-)

関連する問題