簡體   English   中英

如何在Android 4.0+設備上以編程方式禁用“窗口動畫比例”?

[英]How to disable “Window animation scale” programmatically on Android 4.0+ devices?

我正在使用一個使用WindowManager顯示視圖的服務 ,每次使用時更改視圖的大小都會出現動畫

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

如果我手動禁用縮放動畫,則不會發生動畫。 手動禁用縮放動畫,如下所示: http//www.cultofandroid.com/11143/android-4-0-tip-how-to-find-and-disable-animations-for-a-snappier-experience/

有沒有辦法以編程方式為我的應用程序禁用窗口縮放動畫?

我在使用SystemUI包中的系統覆蓋時遇到了同樣的問題,並決定挖掘源代碼以查看是否可以找到解決方案。 WindowManager.LayoutParams有一些隱藏的好東西,可以解決這個問題。 訣竅是使用WindowManager.LayoutParams的privateFlags成員,如下所示:

windowManagerLayoutParams.privateFlags |= 0x00000040;

如果查看WindowManager.java的第1019行,您將看到0x00000040是PRIVATE_FLAG_NO_MOVE_ANIMATION的值。 對我來說,當我通過updateViewLayout()更改大小時,這確實阻止了我的視圖上出現的窗口動畫

我有使用系統包的優勢,因此我可以直接在我的代碼中訪問privateFlags,但如果要訪問此字段,則需要使用反射。

正如@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
    }
}

你嘗試過Activity#overridePendingTransition(0, 0)嗎?

查看文檔

在startActivity(Intent)或finish()的一種風格之后立即調用,以指定下一步要執行的顯式轉換動畫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM