Android 5.1系統動畫的調節
阿新 • • 發佈:2019-02-15
專案需要從系統級別將Activity過渡動畫全部關閉,在SettingsProvider中將TRANSITION_ANIMATION_SCALE設為0。
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadFractionSetting(stmt, Settings.System.TRANSITION_ANIMATION_SCALE,
R.fraction.def_window_transition_scale, 0);
另外:frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
附:float mTransitionAnimationScaleSetting = 0.0f;
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
float mWindowAnimationScaleSetting = 1.0f;
float mTransitionAnimationScaleSetting = 1.0f;
float mAnimatorDurationScaleSetting = 1.0f;
以上三者依次作用於:
1.Window:作用於非Activity視窗。
2.Activity:過渡效果。
3.View:屬性動畫,漣漪效果等。
依次是開發者選項中以下幾項:
視窗動畫縮放
過渡動畫縮放
動畫程式時長縮放
WindowManagerService對應的程式碼:
@Override public void setAnimationScale(int which, float scale) { if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, "setAnimationScale()")) { throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); } scale = fixScale(scale); switch (which) { case 0: mWindowAnimationScaleSetting = scale; break; case 1: mTransitionAnimationScaleSetting = scale; break; case 2: mAnimatorDurationScaleSetting = scale; break; } // Persist setting mH.sendEmptyMessage(H.PERSIST_ANIMATION_SCALE); } @Override public void setAnimationScales(float[] scales) { if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE, "setAnimationScale()")) { throw new SecurityException("Requires SET_ANIMATION_SCALE permission"); } if (scales != null) { if (scales.length >= 1) { mWindowAnimationScaleSetting = fixScale(scales[0]); } if (scales.length >= 2) { mTransitionAnimationScaleSetting = fixScale(scales[1]); } if (scales.length >= 3) { mAnimatorDurationScaleSetting = fixScale(scales[2]); dispatchNewAnimatorScaleLocked(null); } } // Persist setting mH.sendEmptyMessage(H.PERSIST_ANIMATION_SCALE); }
@Override
public float getAnimationScale(int which) {
switch (which) {
case 0: return mWindowAnimationScaleSetting;
case 1: return mTransitionAnimationScaleSetting;
case 2: return mAnimatorDurationScaleSetting;
}
return 0;
}
@Override
public float[] getAnimationScales() {
return new float[] { mWindowAnimationScaleSetting, mTransitionAnimationScaleSetting,
mAnimatorDurationScaleSetting };
}