开发者选项中动画设置开关
条评论简介
开发者选项中动画设置:
- 窗口动画缩放(Windos animation scale)
- 过渡动画缩放(Transition animation scale)
- 动画程序时长缩放(Animation duration scale)
分别对应Window动画(非Activity窗口。比如,Dialog、toast、自定义浮窗、输入法等窗口)、Activity动画(Activity窗口。Activity窗口)、View动画(比如View属性动画、水波纹背景动画)
原理
Setting设置动画
代码路径
1 | packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java |
WindowManagerService提供了setAnimationScale() API供Setting使用
1 | import android.os.RemoteException; |
setAnimationScale()函数
setAnimationScale()函数在frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java中
1 |
|
打印dump信息
执行命令
1 | adb shell dumpsys window w -a |
Window动画时长设置
Window动画的设置是通过frameworks\base\services\core\java\com\android\server\wm\WindowStateAnimator.java文件的setAnimation()函数来完成的
1 | public void setAnimation(Animation anim, long startTime) { |
调用Animation.scaleCurrentDuration()函数来重置动画时长为duration*scale
Activity动画时长设置
Activity切换动画的设置是通过frameworks\base\services\core\java\com\android\server\wm\AppWindowAnimator.java文件的setAnimation()函数来完成的
1 | public void setAnimation(Animation anim, int width, int height, boolean skipFirstFrame) { |
调用Animation.scaleCurrentDuration()函数来重置动画时长为duration*scale
View动画时长设置
View动画时长是通过ValueAnimator.sDurationScale静态变量来控制的
1 | public static IWindowManager getWindowManagerService() { |
在进程启动后第一次调用getWindowManagerService()时便会从WMS中获取缩放值,然后保存到ValueAnimator.sDurationScale中
如果Setting中更新了View动画缩放因子,那么WMS中调用dispatchNewAnimatorScaleLocked()函数后会回调上层应用的onAnimatorScaleChanged()接口,通知应用View的动画时长Scale更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public static IWindowSession getWindowSession() {
synchronized (WindowManagerGlobal.class) {
if (sWindowSession == null) {
try {
InputMethodManager imm = InputMethodManager.getInstance();
IWindowManager windowManager = getWindowManagerService();
sWindowSession = windowManager.openSession(
new IWindowSessionCallback.Stub() {
public void onAnimatorScaleChanged(float scale) {
ValueAnimator.setDurationScale(scale);
}
},
imm.getClient(), imm.getInputContext());
} catch (RemoteException e) {
Log.e(TAG, "Failed to open window session", e);
}
}
return sWindowSession;
}
}
对于View动画,如果动画时长使用了ValueAnimator.sDurationScale,那么必然受”Animator duration scale”控制
本文标题:开发者选项中动画设置开关
文章作者:xmaihh
发布时间:2018-06-30
最后更新:2018-06-30
原始链接:https://xmaihh.github.io/blog/2018/06/30/kai-fa-zhe-xuan-xiang-zhong-dong-hua-she-zhi-kai-guan/
版权声明:采用[CC BY-NC-SA 4.0许可协议]进行许可
分享