项目需要从系统级别将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 };
}