それで、私はアニメーションを操作しようとしていますが、これまでのところ、かなりの頭痛の種でした。私がここでやろうとしていることも、私が通常見ているものとは少し異なります。
シナリオは、アクティビティの起動時に FragmentTransactions を使用して ListFragment を膨らませることです。リストアイテムをクリックすると、アイテムが画面の上部にスクロールして、アクションバーの下部に接触するようにします。それだけでなく、リスト項目の下部を画面の下部まで拡大したい。そのすべてを行っている間に、FragmentTransactions を使用して別の ListFragment を、リスト項目の下の拡張された領域に追加したいと考えています。親の ListView はスクロール不可にする必要がありますが、ユーザーが上部のロックされたリスト項目をクリックして展開された領域を折りたたむため、クリック可能にする必要があります。そして、内側の ListFragment 内の別のリスト項目をクリックするとどうなるか想像できます。プロセス全体が繰り返されます。
複数の Fragment を開いたとします。これらのロックされたリスト項目は互いの上に積み重ねられる必要があります。現在のものを下にドラッグして、それらすべてを互いに積み重ねて表示できるようにしたいのですが、ListView がスクロール不可に設定されていると問題になる可能性があります。ここでのアイデアは、スクロールを特定の領域に制限しようとしていると言えます。
私がやったこと、またはやろうとしたことは、リスト項目 XML に FrameLayout を追加し、その可視性を GONE に設定することです。幅と高さの両方を match_parent に設定しました。相対的なレイアウトの高さが 128 dp に設定されていて、Frame_Layout の高さを画面の一番下までにしたい場合、どうすればよいのでしょうか。とにかく、下のマージンを高さから引いた値に設定して、非表示にして後で拡大し、アイテムが拡大するとその下にある他のリストアイテムを押し下げます。ValueAnimator を使用してアニメーション値を展開から折りたたみに設定していますが、そのためのコードが間違っているか、めちゃくちゃになっていると思います。私はこれらすべてにかなり混乱していますが、以下に私のコードを示します。これはすべて、View 内のカスタム Adapter の getView メソッドに組み込まれています。onClickListener. しかし、それは別の問題をもたらします。ListFragment で onListItemClick() をオーバーライドすると、View.onClickListener と onListItemClick() のどちらが先に実行されますか?
public void setAnimation(final View item, final View viewToBeExpanded)
{
// Gets the height and the reference for viewToBeExpanded's LayoutParams
layoutParams = ((FrameLayout.LayoutParams) viewToBeExpanded.getLayoutParams());
viewToBeExpanded_height = layoutParams.height;
viewToBeExpanded_bottomMargin = layoutParams.bottomMargin;
layoutParams.bottomMargin = -viewToBeExpanded_height + viewToBeExpanded_bottomMargin;
item.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
if (expanded == true) {
expanded = false;
expandAnimator = ValueAnimator.ofInt(layoutParams.bottomMargin, viewToBeExpanded_bottomMargin);
expandAnimator.setTarget(viewToBeExpanded);
expandAnimator.setDuration(500);
expandAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
layoutParams.bottomMargin = (Integer) animation.getAnimatedValue();
viewToBeExpanded.invalidate();
viewToBeExpanded.requestLayout();
}
});
viewToBeExpanded.setVisibility(View.VISIBLE);
expandAnimator.start();
} else {
collapseAnimator = ValueAnimator.ofInt(viewToBeExpanded_bottomMargin, -viewToBeExpanded_height + viewToBeExpanded_bottomMargin);
collapseAnimator.setTarget(viewToBeExpanded);
collapseAnimator.setDuration(500);
collapseAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
layoutParams.bottomMargin = (Integer) animation.getAnimatedValue();
viewToBeExpanded.invalidate();
viewToBeExpanded.requestLayout();
}
});
collapseAnimator.start();
}
}
});
viewToBeExpanded.setVisibility(View.GONE);
}