次のようなネストされたレイアウトがあります。
<LinearLayout> <!----Parent layout--->
<LinearLayout> <!-----child 1--->
...
</LinearLayout> <!----child 1 ended--->
<LinearLayout> <!-----child 2--->
...
</LinearLayout> <!----child 2 ended--->
</LinearLayout> <!----Parent endded--->
私が今抱えている問題は、すべてのデータ項目が子1または子2 Linearlayout
内にあるため、項目を追加または削除すると、子linearlayoutはanimateLayoutChangesの効果でアニメーション化されますが、親レイアウトはアニメーションを実行します。 (私が持っています Android:animateLayoutChanges
すべての線形レイアウトでtrue
に設定)。特に、子1内のアイテムを削除すると、アニメーション効果がおかしくなります(基本的に、子1がまだアニメーションを実行している間に子2がジャンプします)。
誰もこれを解決する方法を知っていますか?
ありがとう
[〜#〜] update [〜#〜]
この質問を投稿してまもなく、Android LayoutTransition APIの開発者向けサイトで見つけました。
ネストされたビュー階層の複数のレベルでLayoutTransitionを使用すると、レイアウトのさまざまなレベルの相互関係のために機能しない場合があります。
だから、誰もこの問題の提案に対処していますか?
animateLayoutChanges
プロパティはLayoutTransitions
を使用します。これは、レイアウトの子と、Android 4.0以降、レイアウト階層の先祖の両方をアニメーション化するツリーのトップ。ハニカムでは、レイアウトの子のみがアニメーション化されます。詳細については、 this Android Developers Blog post を参照してください。
残念ながら、現在、レイアウトの兄弟をそのLayoutTransitions
に反応させる簡単な方法はないようです。 TransitionListener
を使用してレイアウトの境界が変更されたときに通知を受け取り、アニメーターを使用してそれに応じて兄弟ビューを移動してみてください。 this Google+ post のChet Haaseの2番目の回答を参照してください。
[〜#〜] edit [〜#〜]-そこに判明is方法です。 Android 4.1+(APIレベル16+)では、デフォルトで無効になっているレイアウト遷移タイプCHANGING
を使用できます。コードで有効にするには:
ViewGroup layout = (ViewGroup) findViewById(R.id.yourLayout);
LayoutTransition layoutTransition = layout.getLayoutTransition();
layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
したがって、この例では、子2レイアウトをアニメーション化するには、CHANGING
レイアウト変換を有効にする必要があります。その変換は、親の境界に変化があるときに適用されます。
このDevBytesビデオ を参照してください。
Android:animateLayoutChanges属性をLinearLayoutに追加しましたが、変更はアニメーションをトリガーしませんでした。これを修正するには、次のコードを使用します。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
((ViewGroup) findViewById(R.id.llRoot)).getLayoutTransition()
.enableTransitionType(LayoutTransition.CHANGING);
}
詳細 。
親の遅延トランジションもアニメーション化に役立つようです。少なくとも私にとって、次のコードは適切な展開/折りたたみアニメーションを提供します。
expandTrigger.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TransitionManager.beginDelayedTransition(parentLayout);
expanded = !expanded;
child1.setVisibility(expanded ? View.VISIBLE : View.GONE);
}
});
深くネストされたレイアウトの場合、TransitionManager
の呼び出しで、階層の上位にある親を使用する必要がある場合があります。