android可以在開發(fā)者選項-動畫程序時長調(diào)整修改動畫縮放時間攘蔽,也可以關(guān)閉動畫龙屉。如圖:
修改之后會影響Animator,不影響Animation满俗。如果關(guān)閉動畫转捕,也會影響Lottie動畫。
如何影響Animator
在創(chuàng)建窗口或者動畫縮放改變之后唆垃,系統(tǒng)會調(diào)用ValueAnimator. setDurationScale設置app全局的縮放比例五芝,并把值保存到sDurationScale。
@TestApi
public static void setDurationScale(float durationScale) {
sDurationScale = durationScale;
}
在ValueAnimator.doAnimationFrame方法計算動畫辕万,獲取經(jīng)過縮放的時間間隔枢步,如果時間間隔為0,則標記為結(jié)束蓄坏,整個動畫也就結(jié)束了价捧。立刻觸發(fā)AnimatorListener的onAnimationStart和onAnimationEnd方法
private long getScaledDuration() {
return (long)(mDuration * resolveDurationScale());
}
private float resolveDurationScale() {
return mDurationScale >= 0f ? mDurationScale : sDurationScale;
}
如何影響Lottie
LottieAnimationView在初始化時會判斷系統(tǒng)的縮放是否為0丑念,并設置到LottieDrawable.systemAnimationsEnabled涡戳。
lottieDrawable.setSystemAnimationsAreEnabled(Utils.getAnimationScale(getContext()) != 0f)
public final class Utils {
public static float getAnimationScale(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return Settings.Global.getFloat(context.getContentResolver(),
Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f);
} else {
//noinspection deprecation
return Settings.System.getFloat(context.getContentResolver(),
Settings.System.ANIMATOR_DURATION_SCALE, 1.0f);
}
}
}
在調(diào)用playAnimation方法時,如果systemAnimationsEnabled為false則會直接直接調(diào)用endAnimation方法脯倚。立刻觸發(fā)AnimatorListener的onAnimationStart和onAnimationEnd方法
@MainThread
public void playAnimation() {
if (compositionLayer == null) {
lazyCompositionTasks.add(new LazyCompositionTask() {
@Override
public void run(LottieComposition composition) {
playAnimation();
}
});
return;
}
if (systemAnimationsEnabled || getRepeatCount() == 0) {
animator.playAnimation();
}
if (!systemAnimationsEnabled) {// 系統(tǒng)設置關(guān)閉了動畫渔彰,執(zhí)行endAnimation
setFrame((int) (getSpeed() < 0 ? getMinFrame() : getMaxFrame()));
animator.endAnimation();
}
}
如何修復Animator
反射調(diào)用ValueAnimator的靜態(tài)方法setDurationScale,把sDurationScale設置為1.0f
如何修復Lottie
反射從LottieAnimationView獲取lottieDrawable推正,然后反射設置lottieDrawable.systemAnimationsEnabled為true
是否可以修改系統(tǒng)屬性恍涂?
修改Settings.Global.ANIMATOR_DURATION_SCALE需要權(quán)限android.permission.WRITE_SECURE_SETTINGS,但是這個權(quán)限只能系統(tǒng)app申請植榕,所以普通app不能修改這個屬性