4

内で指定したLayoutAnimationController特定の子のみがアニメーション化されるようにAndroidをオーバーライドすることは可能ですか?私の目標は、の現在の状態に基づいて子ビューの任意のセットを選択し、まったく同時に同じアニメーションでアニメーション化し、後で別の任意の子ビューのセットを選択して同じことを行うことです。 。の実行が終了するまで、これを継続的に実行できるようにしたいと思います。ViewViewGroupActivityActivity

これまで、いくつかのオプションを検討して却下しました。

  1. ただし、特定の子ビューを個別に呼び出すstartAnimation(Animation)と、特に任意のセットのビューの数が多い場合に、すべてが完全に同時に開始および終了するという保証はありません。
  2. オーバーライドLayoutAnimationController.getAnimationForView()するのが最も簡単な方法のように見えましたが、メソッドは最終的なものであり、オーバーライドすることはできません。

私はこれについてしばらく頭を悩ませていて、StackOverflowを試してみることにしました。

4

3 に答える 3

7

Androidを変更する方法を見つけることができませんでしたがLayoutAnimationController、私が望むことを実行する簡単な解決策を思いつきました。View必要に応じて、アニメーションを実行するための呼び出しを選択的に無視できるサブクラスを作成しました。

public class AnimationAverseView extends View {

    private boolean mIsAnimatable = true;

    public void setAnimatible(boolean isAnimatable) {
        if (!isAnimatable) {
            clearAnimation();
        }
        mIsAnimatable = isAnimatable;
    }

    @Override
    public void startAnimation(Animation animation) {
        if (mIsAnimatable) {
            super.startAnimation(animation);
        }
    }
}

Viewを介してアニメーション化するだけなので、他の可能なアニメーション関連の方法については心配しませんでしたLayoutAnimationController

于 2012-10-05T08:32:11.937 に答える
1

この質問は7年6か月前に行われたようですが、今日私は自分でこの質問に遭遇し、カスタムの子ビューを作成するのは少し面倒に思えます。

カスタムの外部レイアウトを使用すると、attachLayoutAnimationParametersをオーバーライドする必要があるというトリックがうまくいくように見えることがわかりました。このメソッドは、レイアウトアニメーションの一部であるすべての子ビューに対して呼び出され、レイアウトアニメーションがViewGroup内で実際にトリガーされたときに呼び出されます。AnimationLayoutParamsを子にアタッチしています。この場合、アニメーション化されます。つまり、LayoutAnimationパラメータを子にアタッチしない場合、それはレイアウトアニメーションの一部にはなりません。

class CustomLayout @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private val excludeForLayoutAnimation by lazy {
        listOfNotNull(findViewById(R.id.text), findViewById(R.id.fab))
    }

    override fun attachLayoutAnimationParameters(
        child: View?,
        params: ViewGroup.LayoutParams?,
        index: Int,
        count: Int
    ) {
        if (child !in excludeForLayoutAnimation) {
            super.attachLayoutAnimationParameters(child, params, index, count)
        }
    }

}

外側のカスタムビューでこれを単純に呼び出すと、指定した子が除外されます。

customView?.apply {
    layoutAnimation = AnimationUtils.loadLayoutAnimation(
        context,
        R.anim.layout_animation_fade_in
    )
    scheduleLayoutAnimation() // or maybe startLayoutAnimation()
}
于 2020-04-02T15:51:43.907 に答える
0

受け入れられた回答にコメントを追加できないため、ここにいくつかの追加情報を追加します。happydude(2月17日)からのコメントは私にとっても正しかった。FrameLayoutヘッダーの最も外側のビューとしてを使用しました。ヘッダーがリストの残りの部分でアニメーション化されないように、メソッドをListViewオーバーライドする必要がありました。setAnimation()したがって、オーバーライドする必要がある可能性のある他のアニメーションメソッドを確認する必要があります。

于 2015-11-03T03:55:13.753 に答える