web-dev-qa-db-ja.com

ExpandableListViewのアニメーション

ExpandableListViewに展開または折りたたみアニメーションを適用することは可能ですか?

30
dursun

これは、最初は非表示のビューとAnimationを拡張するカスタムクラスを含む単純なListViewを使用して実行できます。基本的な考え方は、View.GONEから始めて、可視性をView.VISIBLEに設定しながら、マージンを負の値から必要なサイズに徐々にサイズ変更することです。

見る:

..そして最後に

最後の例には、必要なすべてのコードが含まれています。特に最初にview.bottomMargin = -50以上を設定する必要があるという事実は、私には少しハックに見えます。そうしないと、アニメーションは最初は正しく機能しませんが、これまでのところ、実行可能な代替手段は見つかりませんでした( ListViewの代わりに独自のコンテナアイテムを使用したScrollView)。

そして最後に、このアプリには、ソースへのリンクを含む他の多くの便利な例の中で、上記の例が含まれています。

更新:Googleは知的財産権侵害の疑いでアプリをPlayストアから削除しました(ただし、デモとオープンソースプロジェクトへのリンクしか含まれていませんでした)が、著者はapkを http://goo.gl/ihcgs 詳細については、 https://plus.google.com/108176685096570584154/posts を参照してください。注意:私は著者とは関係がありません。

10
ccpizza

単純なリストビューについても同様の作業を行いました。そのために、getViewメソッドをオーバーライドし、各リストアイテムに上(または下)変換アニメーションを適用しました。変換の程度は、リストアイテムの位置によって決定されました。

1

この問題の可能な(部分的な)回避策を見つけました。

まず、ExpnadableListViewのスクロール状態を保存する必要があります。

@Override
public void onScrollStateChanged(final AbsListView view, final int scrollState) {
    this.mScrollState = scrollState;
}

public int getScrollState() {
    return this.mScrollState;
}

listView自体については、クリックされたグループを保存して、その子だけがアニメーション化されるようにする必要があります。

mListView.setOnGroupClickListener(...
@Override
public boolean onGroupClick(...){
mGroupPosition=groupPosition;

ここで、getChildView()メソッドで、スクロールの状態を確認し、アイドル状態の場合は、次のようにアニメーションを開始します。

public View getChildView(...) {
// <=prepare rootView and return it later
if (groupPosition==mGroupPosition&&getScrollState() == OnScrollListener.SCROLL_STATE_IDLE)
    rootView.setAnimation(...)

これにより、グループを展開するたびに子ビューのアニメーションが設定されます。

これの欠点は次のとおりです。

  1. 拡張された子ビューの場合のみ。グループを折りたたむときにそれらをアニメーション化するために、追加のロジックを考える必要があります。
  2. すべてのアニメーションは一度に始まります。それ以外の方法で機能させたい場合は、複数のアニメーションを次々に追加する必要があります。
1