9

を使用してビューを表示するサービスWindowManagerを使用していますが、を使用してビューのサイズを変更するたびにアニメーションが発生します

windowManagerLayoutParams.height = newHeight;
((WindowManager) getSystemService(WINDOW_SERVICE)).updateViewLayout(mMainLayout, windowManagerLayoutParams);

スケール アニメーションを手動で無効にすると、アニメーションは発生しません。次のように、手動でアニメーションを無効にし ます。

アプリケーションのウィンドウ スケール アニメーションをプログラムで無効にする方法はありますか?

4

3 に答える 3

16

SystemUI パッケージのシステム オーバーレイの作業中に同じ問題が発生したため、ソースを調べて解決策を見つけられるかどうかを確認することにしました。 WindowManager.LayoutParamsには、この問題を解決できる隠し機能がいくつかあります。秘訣は、次のようにWindowManager.LayoutParamsの privateFlags メンバーを使用することです。

windowManagerLayoutParams.privateFlags |= 0x00000040;

WindowManager.javaの 1019 行を見ると、0x00000040 が PRIVATE_FLAG_NO_MOVE_ANIMATION の値であることがわかります。私の場合、updateViewLayout()でサイズを変更すると、ビューでウィンドウアニメーションが発生しなくなりました

システム パッケージで作業する利点があったため、コード内で直接 privateFlags にアクセスできますが、このフィールドにアクセスする場合はリフレクションを使用する必要があります。

于 2013-10-07T18:03:29.927 に答える
8

@clarkが述べたように、これはリフレクションを使用して変更できます。

private void disableAnimations() {
    try {
        int currentFlags = (Integer) mLayoutParams.getClass().getField("privateFlags").get(mLayoutParams);
        mLayoutParams.getClass().getField("privateFlags").set(mLayoutParams, currentFlags|0x00000040);
    } catch (Exception e) {
        //do nothing. Probably using other version of android
    }
}
于 2015-10-16T13:04:34.310 に答える
0

試しましたActivity#overridePendingTransition(0, 0)か?

ドキュメントをチェックしてください:

startActivity(Intent) または finish() のフレーバーのいずれかの直後に呼び出して、次に実行する明示的な遷移アニメーションを指定します。

于 2013-07-22T12:47:50.407 に答える