expandableListView に展開または折りたたみのアニメーションを適用することは可能ですか?
3 に答える
これは、最初は非表示になっているビューと、アニメーションを拡張するカスタムクラスを含む単純なListViewを使用して実行できます。基本的な考え方は、最初にView.GONE
マージンのサイズを負の値から必要なサイズに徐々に変更し、可視性をに設定することView.VISIBLE
です。
見る:
- https://github.com/tjerkw/Android-SlideExpandableListView
- Androidアニメーション:メニューの非表示/表示
- View.setVisibility(GONE)をアニメーション化するにはどうすればよいですか
..そして最後に
最後の例には、必要なすべてのコードが含まれています。特に最初に設定する必要があるという事実は少しハックに見えますview.bottomMargin = -50
。そうしないと、アニメーションが最初は正しく機能しませんが、これまでのところ、実行可能な代替手段は見つかりませんでした(独自のコンテナでScrollViewを使用することを除いて) ListViewの代わりにアイテム)。
そして最後に、このアプリには、ソースへのリンクを含む他の多くの便利な例の中で、上記の例が含まれています。
更新:Googleは、知的財産権侵害の疑いでアプリをPlayストアから削除しました(ただし、デモとオープンソースプロジェクトへのリンクのみが含まれていました)。著者は、apkをhttp://goo.gl/ihcgsから直接ダウンロードできるようにしました 。詳細については、https://plus.google.com/108176685096570584154/postsをご覧ください。注意:私は著者とは関係がありません。
単純なリスト ビューに対して同様の作業を行いました。そのために、getView メソッドをオーバーライドし、各リスト アイテムに上方向 (または下方向) の移動アニメーションを適用しました。移動の程度は、リスト アイテムの位置によって決まりました。
この問題の (部分的な) 回避策を見つけました。
まず、 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(...)
これにより、グループを展開するたびに子ビューのアニメーションが設定されます。
これの欠点は次のとおりです。
- 展開された子ビューのみ。グループを折りたたむときにそれらをアニメーション化するには、追加のロジックを考える必要があります。
- すべてのアニメーションが一度に開始されます。他の方法で動作させたい場合は、複数のアニメーションを次々に追加する必要があります。