有人知道overridePendingTransition页面跳转动画的原理么
答案:1 悬赏:10 手机版
解决时间 2021-01-15 02:55
- 提问者网友:一抹荒凉废墟
- 2021-01-14 15:31
有人知道overridePendingTransition页面跳转动画的原理么
最佳答案
- 五星知识达人网友:未来江山和你
- 2021-01-14 16:41
1.Activity中overridePendingTransition,显然我们都用这个的啦,看代码:ActivityManagerNative.getDefault().overridePendingTransition(
mToken, getPackageName(), enterAnim, exitAnim); 目标转向ActivityManagerNative
2.ActivityManagerNative是神马东东?看其定义:public abstract class ActivityManagerNative extends Binder implements IActivityManager
这可以知道,他是xxxxxx,我日,这才发现需要Android系统的IPC只是。
好吧,其实是这样,android本身有很多Service,这些服务从开机启动就一直在跑,比如media,比如windowmanager,这些服务对外提供接口,有些是一直到最上层都要用到的,比如Media,有些只给内部用,比如windowmanager(亲,我说的是这个service,别跟我们用的WindowManager混淆了),只给内部用和给上层用是两种不同的概念。为毛?因为内部用的话他们是同一个进程,没必要跨进程通信,也就是没ipc问题,而给外部用,就需要Ipc了。
扯远了,说说我们这个ActivityManagerNative,他就是IActivityManager的【本地】代理,ActivityManagerNative.getDefault()得到的就是IActivityManager对象。IActivityManager又是毛???没错,它是WindowManagerService的顾客。。。它里面就是跟WindowManagerService通信的啦。。。(android binder ipc神马的最讨厌了)
3.呃,回到1中说的那个ActivityManagerNative.getDefault(),上面说他是得到IActivityManager用的,IActivityManager里面的overridePendingTransition直接跟server端通话。
“Hello,啊 ,WindowManagerService,我是你的代理IActivityManager君啊,刚接到任务要改变activity的切换画面啊。"
"ok,IActivityManager,在外面风吹日晒的辛苦你了,其他的交给我吧。作为NB哄哄的Service大人,我帮你解决之。“
毫不犹豫的,WindowManagerService执行以下代码:
public void overridePendingAppTransition(String packageName,
int enterAnim, int exitAnim) {
if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
mNextAppTransitionPackage = packageName;
mNextAppTransitionEnter = enterAnim;
mNextAppTransitionExit = exitAnim;
}
}
4. 额,这下已经到了WindowManagerService了,这个方法(overridePendingAppTransition)中mNextAppTransitionEnter等变量赋值。
这些变量在window进行切换的时候会进行处理。remove->removeWindow->removeWindowLocked->applyAnimationLocked(注意,这些说的都是WindowManagerService中的方法)
那么这个remove(具体是
public void remove(IWindow window) {
removeWindow(this, window);
})什么时候用的呢,这个,这个。。。。在ViewRoot和SurfaceView中都会调用到的。
mToken, getPackageName(), enterAnim, exitAnim); 目标转向ActivityManagerNative
2.ActivityManagerNative是神马东东?看其定义:public abstract class ActivityManagerNative extends Binder implements IActivityManager
这可以知道,他是xxxxxx,我日,这才发现需要Android系统的IPC只是。
好吧,其实是这样,android本身有很多Service,这些服务从开机启动就一直在跑,比如media,比如windowmanager,这些服务对外提供接口,有些是一直到最上层都要用到的,比如Media,有些只给内部用,比如windowmanager(亲,我说的是这个service,别跟我们用的WindowManager混淆了),只给内部用和给上层用是两种不同的概念。为毛?因为内部用的话他们是同一个进程,没必要跨进程通信,也就是没ipc问题,而给外部用,就需要Ipc了。
扯远了,说说我们这个ActivityManagerNative,他就是IActivityManager的【本地】代理,ActivityManagerNative.getDefault()得到的就是IActivityManager对象。IActivityManager又是毛???没错,它是WindowManagerService的顾客。。。它里面就是跟WindowManagerService通信的啦。。。(android binder ipc神马的最讨厌了)
3.呃,回到1中说的那个ActivityManagerNative.getDefault(),上面说他是得到IActivityManager用的,IActivityManager里面的overridePendingTransition直接跟server端通话。
“Hello,啊 ,WindowManagerService,我是你的代理IActivityManager君啊,刚接到任务要改变activity的切换画面啊。"
"ok,IActivityManager,在外面风吹日晒的辛苦你了,其他的交给我吧。作为NB哄哄的Service大人,我帮你解决之。“
毫不犹豫的,WindowManagerService执行以下代码:
public void overridePendingAppTransition(String packageName,
int enterAnim, int exitAnim) {
if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
mNextAppTransitionPackage = packageName;
mNextAppTransitionEnter = enterAnim;
mNextAppTransitionExit = exitAnim;
}
}
4. 额,这下已经到了WindowManagerService了,这个方法(overridePendingAppTransition)中mNextAppTransitionEnter等变量赋值。
这些变量在window进行切换的时候会进行处理。remove->removeWindow->removeWindowLocked->applyAnimationLocked(注意,这些说的都是WindowManagerService中的方法)
那么这个remove(具体是
public void remove(IWindow window) {
removeWindow(this, window);
})什么时候用的呢,这个,这个。。。。在ViewRoot和SurfaceView中都会调用到的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯