澳门新葡萄京官网注册 6

Activity 切换动画—点击哪里从哪放大

当本身第一回展开 twitter
的时候,就被它的启航动漫惊艳到了。但是深入分析一下那一个动漫其实也易于实现,于是飞快做三个出去看看。

本篇随笔已授权Wechat公众号 安卓巴士Android开拓者门户 独家发表

澳门新葡萄京官网注册 1

emmmm,本次来梳理一下 Activity
切换动漫的商讨。首先,老规矩,看一下意义图:

漫天动画效果能够拆分为以下几步:

  • 布署三个与 LaunchScreen 近似的分界面
  • 让视图中间的 Logo 先收缩后加大直至盖满整个显示器
  • Logo 在加大进度中逐步变透明
  • Initial View Controller 的故事情节有一点放大后恢复生机原状

拆分完之后就好办咯,一步步来落到实处呢~

效果图

效果图.gif

此次要兑现的动漫效果正是相同于上海体育场地那样,点击有个别 view,就从十三分 view
张开下个 Activity,Activity 退出时原路再次回到,即缩放到点击的那么些 view

先布个界面吧

由于后边必要让 logo 变透明,大家筛选拔 mask 来落到实处。

let logoLayer = CALayer()
logoLayer.bounds = CGRect(x: 0, y: 0, width: 100, height: 100)
logoLayer.position = view.center
logoLayer.contents = UIImage(named: "logo")?.cgImage
view.layer.mask = logoLayer

澳门新葡萄京官网注册 2

好了,小鸟出来了。

但一初叶那几个 logo 实际不是晶莹的,于是先在其上盖一层赤褐的
view,并改一下背景颜色吗。

let shelterView = UIView(frame: view.frame)
shelterView.backgroundColor = .white
view.addSubview(shelterView)

window!.backgroundColor = UIColor(red: 29 / 255.0, green: 161 / 255.0, blue: 242 / 255.0, alpha: 1)

澳门新葡萄京官网注册 3

棒,第一步成功。

达成思路

emmm,假如要你来做这么贰个功效,你会怎么办呢?

咱俩就一步步的来出主意。

先是来讲说,要给 Activity
的切换写动漫的话,能够经过什么来兑现?或然这种情景比非常少,但相信大家多多少少知道有些,嗯,假设您要么比不大清楚的话,能够先看看这篇贯彻Activity跳转动漫的多种格局,那几个大神总计了二种方式,差十分少过一下有啥方案就可以,小编也没深切阅读,感兴趣的话再逐月看就足以了。

那边就大概计算一下二种办法:

1.行使 style 的措施定义 Activity 的切换动漫
2.使用 overridePendingTransition 方法实现 Activity 跳转动漫
3.选用 ActivityOptions 切换动漫完毕 Activity 跳转动漫(部分卡通可帮助到
api >= 16State of Qatar
4.接收 ActivityOptions 动漫分享组件的措施完毕跳转 Activity 动漫(api
>= 21卡塔尔

当下自家询问的也大意便是以上两种方法,前三种选拔方法非常不难,只需求在 xml
中写相应的动漫(滑进滑出动漫、渐变动漫、放大动漫等),然后选取到相应的
activity 就可以。並且还无需思忖相当的低版本难题。

<!--style方式-->
<item name="android:activityOpenEnterAnimation">@anim/anim_activity_enter</item>
<item name="android:activityCloseExitAnimation">@anim/anim_activity_exit</item>

//代码方式
startActivity(intent)
overridePendingTransition(R.anim.anim_activity_enter, R.anim.anim_activity_exit);

//anim_activity_enter.xml 和 anim_activity_exit.xml 就是在 xml 中写动画

上述二种办法利用非常粗略,效果也很好。症结正是,缺乏利索,只好促成 xml
写出的动漫,即运动、渐变、缩放等着力动漫的构成,不可能贯彻绚烂的卡通片。

就此,鲜明,我们伊始效果图突显的动漫片,用那二种 xml
达成的卡通格局并从未主意做到,因为放大动漫的主干点地点是索要动态计算的澳门新葡萄京官网注册 ,。xml
中写缩放动漫时,大旨点只好是写死的。

那样的话, style 的动漫片方案和 overridePendingTransition
的方案就不能不先抛开了
,那么再持续看看别的的方案。

ActivityOptions 动漫达成方案应该是 谷歌 在 Android 5.0 之后推出
Material Design 种类里的三个转场动漫方案。当然,Google在世襲也分娩了一部分置于动漫,方便开辟者直接运用。

MaterialDesign动漫示例.gif

上海教室便是 Google 推出的 Material Design 标准的动漫片完成里四个示范。关于
Android 5.0
后的卡通,网络第一次全国代表大会堆相关文章,笔者也没在此上头里去深刻研究过,所以那边就不许备介绍动漫要怎么用(不然误导我们就不好了),感兴趣的能够慈祥去英特网找找哈,这里就说下如若要促成伊始介绍的卡通片,用这种方法可行不可行,可行的话又该如何做。

那随着做 Logo 的压缩放大吧

此处大家用
CAKeyframeAnimation,让那么些缩放动作旁逸横出。设置好起来时间、持续时间和顺序关键帧,最后让它保持动漫最终的意况。

let logoAnimation = CAKeyframeAnimation(keyPath: "bounds")
logoAnimation.beginTime = CACurrentMediaTime() + 1
logoAnimation.duration = 1
logoAnimation.keyTimes = [0, 0.4, 1]
logoAnimation.values = [NSValue(cgRect: CGRect(x: 0, y: 0, width: 100, height: 100)),
                    NSValue(cgRect: CGRect(x: 0, y: 0, width: 85, height: 85)),
                    NSValue(cgRect: CGRect(x: 0, y: 0, width: 4500, height: 4500))]
logoAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut),
                             CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)]
logoAnimation.isRemovedOnCompletion = false
logoAnimation.fillMode = kCAFillModeForwards
logoLayer.add(logoAnimation, forKey: "zoomAnimation")

澳门新葡萄京官网注册 4

又好了。

Android 5.0+ Activity 转场动漫

开个小标题,因为感觉上面会讲相当多的东西。

开头效果图的动漫片:新的 Activity 在点击的 View 的骨干点放大。

倾心图 MaterialDesign 动漫演示中,好像动漫效果也是有个别 View 张开下个
Activity?那那样说的话,这种措施应该正是行得通的了?

对 5.0+
动漫有所明白的话,示例中的动漫应该有个称呼叫:分享成分切换动漫。意思便是字面上说的,七个Activity 切换,能够安装它们的分享成分,也正是能够让上个分界面包车型地铁某部 View
在下个分界面上做动漫的一种作用。

既然那样,大家就先来寻访 5.0+ 动画,用代码怎么写。

5.0后切场动漫调用.png

那一个动漫要怎么落到实处的我们就不看了,间接看怎么利用。上海图书馆的代码是个例子,要是要采取5.0+ 的 Activity 转场动漫,那就不可能再持续使用 startActivity(Intent
intent卡塔尔 了,而是要动用 startActivity(Intent intent, Bundle options)那些措施了。而 options 参数要传播的就透过 ActivityOptions
类钦赐的一对转场动漫了,谷歌为大家封装了部分卡通接口,大家就来探访它扶植什么转场。

ActivityOptions动漫接口列表.png

据此,下边就来说讲 makeScaleUpAnimation() 放大动漫和
makeSceneTransitionAnimation()
分享成分动漫。因为贴近唯有那三个能够兑现早先效果图体现的动画片效果。

对了,上上海体育地方中的 ActivityOptionsCompat 类功效的 ActivityOptions
相似,只是前面三个是 Google 为我们提供的一个合营完毕,因为那是 5.0+
动漫,那么在 5.0 以下的本子就不能够使用了,所以 谷歌(Google卡塔尔提供了合营管理,让某个动漫能够支撑更低版本,动漫效果都肖似,至于里面具体是怎么落到实处,有野趣能够去拜会。但亦非享有的卡通片都完结包容管理的,像
ActivityOptions
提供的三种动漫,基本都得以合作,但分享成分动漫就丰盛了。至于什么动漫能够兼容,哪些不行,张开ActivityOptionsCompat 类就知晓了,这一个类在 support
v4包里,上面就贴张图看看:

ActivityOptionsCompat.png

顺路把 Logo 透明也带上

这一个算好渐变透明的年月就好。

UIView.animate(withDuration: 0.3, delay: 1.4, options: .curveLinear, animations: {
    shelterView.alpha = 0
}) { (_) in
    shelterView.removeFromSuperview()
    view.layer.mask = nil
}

澳门新葡萄京官网注册 5

makeScaleUpAnimation()

makeScaleUpAnimation.png

接口参数的职能都在上海教室里注释了,明白了之后有未有觉察,那个接口达成的动画效果正是我们想要的!!从哪放大,宽高从多少起先放大都能够和煦设定,完美是或不是!

不是的,依然别兴奋太早了,那些接口确实可以兑现点击哪个
View,就从哪些 View 放大的效率。可是回去吗,Activity
退出时要按原路减弱至点击的
View,那个要咋办?是吗,找遍了富有接口都并没有。

无休无止这一点,还应该有我们周边的 setDuration()
有找到么,setInterpolator()
有找到么?未有,都并未有,也正是说假如要用那个接口做动漫的话,动漫的实行时间,还也可能有插值器大家都不能够安装,那那终将无法满意产物的急需啊,哪儿有不改正实施时间和插值器的卡通!就此,那一个方案也放任

末段,让开端分界面颠一下

道理跟第二步相符,就不说了~

let mainViewAnimation = CAKeyframeAnimation(keyPath: "transform")
mainViewAnimation.beginTime = CACurrentMediaTime() + 1.1
mainViewAnimation.duration = 0.6
mainViewAnimation.keyTimes = [0, 0.5, 1]
mainViewAnimation.values = [NSValue(caTransform3D: CATransform3DIdentity),
                            NSValue(caTransform3D: CATransform3DScale(CATransform3DIdentity, 1.1, 1.1, 1)),
                            NSValue(caTransform3D: CATransform3DIdentity)]
view.layer.add(mainViewAnimation, forKey: "transformAnimation")
view.layer.transform = CATransform3DIdentity

澳门新葡萄京官网注册 6

Done.

makeSceneTransitionAnimation()

分享成分动漫就百端待举多了,不管是大家要运用它的格局或许它个中做的事。简单来说,笔者对这几个接触也相当的少,这里就大概富含一下行使的部分步骤:

  1. 亟待对共享的要素设置 transitionName,在 xml 中设置
    android:transitionName 或代码里调用 View.setTransitionName(State of Qatar。

  2. startActivity(Intent卡塔尔 换来 startActivity(Intent intent, Bundle
    options卡塔尔,options 须求通过
    ActivityOptions.makeSceneTransitionAnimation(卡塔尔(قطر‎ 设置。

可取和缺点一会再说,先看看效果:

分享成分动漫.gif

成效常常正是大家想要的,这我们就来讲说这种艺术的优劣势,然后再做决定。

优点:

  1. 跻身和抽离时的卡通片都以由中间得以完结了,我们只须要安装参数就能够。

缺点:

  1. 共享的成分供给设置同一的 transitionName,咱们点击的 View 和开采的
    Activity 是动态的,不显著性的。所以,借使对那些 View 都设置同一的
    transitionName 不知底会不会有新的难点暴发。

  2. 新 Activity 的起先宽高和职位不或然设置,私下认可位置是分享的
    View,也足以驾驭成点击的 View,那点没难题。但开首宽高默许是点击 View
    的轻重,上边 gif 图演示大概效果不太好。也正是说,放大动漫开端时,新
    Activity 是从点击 View
    的宽高作为早前放大至全屏,再次回到时从全屏降低至点击 View
    的宽高。上海体育地方中式点心击的 view 都极小,所以看不出什么,但在 Tv
    应用的页面中,经常有这种超大的
    view,纵然是这种情形,那动漫就超难看了。

  3. 第2点短处或然能够和睦继续 Transition
    写动漫来缓和,但没钻探过分享动漫的规律,还不懂怎么改进。

  4. 最大的老毛病是只帮助 api >= 21 的。

依据最近本事相当不够,不足以灭亡上述劣势所列难点,所以临时甩掉该方案,但前期会利用时间来上学下
5.0+ 转场动漫原理。

emmm,那样一来,岂不是就不能够落时间效益果与利益图所急需的卡通片了?别急,方案照旧有些,继续往下看。

急需总体代码的能够来此处下~

Github: TwitterLauncher

Github 开源库方案

实际上,Github
上有很多这种动漫效果的开源库,小编找了多少个把项目下载下来看了下代码,发掘存的人思绪是那般的:

Activity 跳转时,先把当下分界面截图,然后将那张图传给下个
Activity,然后下个 Activity
展开时将背景设置成上个界面截图传过来的图片,然后再对根布局做推广动漫,动漫甘休后将背景废除掉。

Activity 退出时有两种方案:

方案一:将近来 Activity
背景设置成上个分界面包车型客车截图(那供给对那张图片进行缓存管理,不然图片超级大只怕曾经被回笼了),然后对根构造做裁减动漫,动画截止以往再实施真正的
finish(卡塔尔 操作。

方案二:将前段时间 Activity 分界面截图,然后传给新显示到分界面包车型客车Activity,然后做减少动漫。(那要求 Activity 有贰个置于顶层的 View
来设置截图为背景,然后对那几个 View 做动画。

用 View 动漫来落到实处 Activity 转场动漫效果

(该聚焦集中力啦,亲爱的读者们,上边其实都以废话啦,正是自己要幸好做那几个动画效果进程中的一些找出阶段啦,跟本篇要讲的动漫片完成方案其实关系非常的小了,不想看废话的能够略过,但上边就是本篇要讲的
Activity 切换动漫的落到实处方案了)

碰着了 Github 上海高校神开源库的劝导,作者在想,Activity 分界面其实也正是个
View,那既然那样作者要展开的 Activity
设置成透明的,然后对根布局做推广动漫,那样不就能够了?

想开就做,先是在 style.xml 中装置透明:

<item name="android:windowBackground">@android:color/transparent</item>

下一场实例化一个扩充动漫:

ScaleAnimation scaleAnimation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, x, y);

宽高从 0 开端放大至全屏,x,y 是加大的主干点,这么些能够遵照点击的 View
来总括,先看看效果行还是不行,x,y 就先随意传个值。

动漫片也许有了,那要求找到 Activity
的根构造。想了下,那动画的代码要么是写在基类里,要么是写个特意的帮衬类,不管怎么着,代码都需求有共用性,那怎么用相通的代码找到全数不一致Activity 的根布局呢?

鲜明两个均等的 id,然后设置到各样 Activity 布局文件的第三个 ViewGroup
里?—是行得通,但太难为了,要更改的地点也太多了。

别忘了,各类 Activity 最尾部正是多少个 DecorView,纵然那么些 DecorView
未有 id,但大家得以经过 getWindow(State of Qatar.getDecorView(卡塔尔来获得到它的援用啊

再不然,笔者们 setContentLayout(State of Qatar 都是将自身写的构造文件设置到二个FrameLayout 里,记得吗,那个 FrameLayout 是有 id 的,是 Window
的叁个静态常量 ID_ANDROID_CONTENT
,
所以我们能够通过上边格局来获取到:

View view = activity.findViewById(activity.getWindow().ID_ANDROID_CONTENT);
//View view = activity.getWindow().getDecorView();

透明属性,动漫,View
都有了,那接下去正是实践了,在哪儿实施好吧,onCreate(卡塔尔国 里或 onStart(卡塔尔国里应该都足以。那就先在 onCreate(卡塔尔国 里执行试试看好了。

哦,对了,很关键一点,别忘了,Activity
转场是有暗中同意动漫的,分歧系统或许完毕的不等,所以得把那个默许动漫关掉
,所以能够在
BaseActivity 里重写下 startActivity(卡塔尔(قطر‎,如下:

@Override
public void startActivity(Intent intent) {
    super.startActivity(intent);
    overridePendingTransition(0, 0);
}

overridePendingTransition(0, 0State of Qatar 传入 0
表示不试行切换动漫,显示出来的效能正是下个 Activity
瞬间就显得在显示屏上了,而笔者辈又对下个 Activity 设置了宽高从 0
从前放大的职能,那么优越中达成的效率应该是:当前 Activity
呈现在分界面上,然后下个 Activity 慢慢松手到覆盖住全屏。

好,运营,看下效果:

Activity放大动漫难点.png

咦~,为何相近会是碧绿的呢,都设置了 windowBackground
是透明的了哟,emmm,上网查了下,开采还索要叁个半晶莹剔透属性
windowIsTranslucent,所以去 style.xml 中再加多:

<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>

再运维试一下,看下效果:

Activity放大动漫.png

啊,效果出来了。那就下去正是脱离时的动漫片了。退出动漫跟张开动漫其实正是反进程,动漫形成降低动漫:

ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f, x, y);

事情未发生前从 0 开头推广,以后换到从全屏起首减弱,x,y 就保存在 intent
引导的数目里。那么也就只剩最终二个难点,缩短动漫该如哪天候实行吗?

我们退出一个页面时相近皆以用 finish(卡塔尔国的吧,既然那样,在基类里重写一下那个主意:

@Override
public void finish() {
    ActivityAnimationHelper.animScaleDown(this, new AbsAnimationListener() {
        @Override
        public void onAnimationEnd() {
            BaseActivity.super.finish();
        }
    });
}

x,y 的推测,动漫的贯彻、推行作者都是写在二个帮衬类里,然后在 BaseActivity
里调用。那一个不主要,观念相当的重要。我们重写了
finish(卡塔尔,然后去实施减弱动漫,相似动漫是接纳在 Activity
的根构造,然后写多个动漫片进程的回调,但动漫停止时再去调用
super.finish(卡塔尔(قطر‎。也正是说,但调用了 finish(卡塔尔 时,实际上 Activity 并从未
finish(卡塔尔(قطر‎ 掉,而是先去试行减少动漫,动漫实行实现再真正的去执行 finish(卡塔尔操作。

现今,开首所呈现的效用图的卡通效果已经达成。

但你以为事情做完了么?不,填坑之路才刚初叶!(哭丧脸)

优化之路,又名填坑之路

自己最近说过,这种方案不能不算是一种暂且的代表方案,知道本身怎么着这么说么?因为这种方案实现是会蒙受太多坑了。

1.动漫片的通畅性难题

第一是动漫的流畅性难题,本篇里演示的 gif
图之所以看起来还很流利,是因为切换的八个 Activity
分界面都太轻便了,但分界面布局复杂一点时,张开叁个 Activity
分界面包车型地铁度量、布局、绘制以致大家在 onCreate(卡塔尔国里写的局地加载数据、互连网央求操作跟放大动漫都挤到同盟去了,以致网络央浼回来后更新分界面时动漫都还应该有异常的大或许在施行中,那样动漫的流畅性就更惨了。

在优化时,找到三个大神的一篇文章:一种新的Activity转变动漫实现情势

那篇文章里讲的落实原理就是本篇介绍的方案,何况讲得更详细,能够持续去那篇看一下,相信你对本篇介绍的方案会更清楚。

有几许不一致的是,大神的放大动漫的执行时机是在 onPreDraw()机缘开启的,如下:

view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
    view.getViewTreeObserver().removeOnPreDrawListener(this);
        if (view.getAnimation() == animation && !animation.hasEnded()) {
          return false;
        }
         view.startAnimation(animation);
         return true;
     }
});

emmm,说真话,那一个回调第叁回见,小编也十分的小清楚它的回调机缘是怎么样,功用是怎么着,网络的分解也摸棱两可,没看精通,待继续有的时候光自个儿看看源码好了。

但自个儿能够跟你们一定的是,小编看了一有个别 5.0+ 动漫源码,它里面也是在二个Activity 的 onStart(卡塔尔国 方法里登记了 onPreDraw(卡塔尔(قطر‎回调监听,然后在回调时施行 5.0+
的动漫片。但它此中做的事,远不仅这个,实乃太多了,预计是举办的一部分优化操作,笔者眼下是还尚无技术去搞懂。
但大家动漫施行的时机是急需换一下了,想转手也理解,在 onCreate(卡塔尔国里做动漫,听着就认为稍微意料之外。既然大神,还恐怕有 Google 官方都以在
onPreDraw(卡塔尔国 里实践,那大家自然可以效仿学习。

看 5.0+ 源码进度中,开掘它在动漫最早和终结前会调用壹个 ViewGroup 的
suppressLayout(State of Qatar 方法,这一个情势是隐身的:

suppressLayout.png

那是七个回避的办法,大家要调用的话,就要求经过反射的主意。这一个艺术的注明大约是说糟糕ViewGroup 举办 layout(卡塔尔操作。那样的话,我们有叁个能够优化之处,大家可以在动漫开始时调用那一个法子防止layout(State of Qatar 操作,动画停止时上升。

诸如此比做的益处是,动漫试行进程中,借使互连网或本地数据现已回调,布告 adapter
去刷新 view 时,那样会促成动漫很卡顿。所以,当大家用 suppressLayout(State of Qatar做了优化以往,就唯有等动漫片截至的时候分界面才会去重新 layout
刷新构造,优化动漫流畅性。

但与此相类似做也会有一个主题材料是,借使您在 onCreate(卡塔尔 或 onResume(卡塔尔国之类的主意发起三个 requestFocus(卡塔尔操作的话,很有非常大可能率这么些操作会被放任掉,以致分界面理应获得大旨的 view
发生错乱难题。

至于原因,因为对 suppressLayout(卡塔尔 也还不是很精晓,思考等对 onPreDraw()精通了未来一齐探讨一下。

2.windowIsTranslucent 半透明引发的标题
哇,那么些性格,真的是。。。
你们好奇的话,就网络搜一下以此半晶莹剔透属性,一批各样主题素材。但其实,英特网遭受的那几个难点,作者基本都没遇到过,但我高出的是更奇葩,英特网没找到实施方案的主题素材,哭瞎。

emmm,作者是做 Tv 应用开辟的,windowIsTranslucent
那么些在分歧的盒子上呈现的成效不相符,简直了。

在装置了 android:windowIsTranslucent=true
时,有的盒子分界面就可以是晶莹剔透的,即便你设置了一张不透明的背景图,但发光度不会很认定。
局地盒子则是在新的 Activity 打开时,假使 view
未有完全加载出来,则会显得上个 Activity 的分界面,产生的情景正是开采新
Activity 时,会弹指间闪过上个分界面包车型地铁画面。

再有,Tv 应用平常都会跟录像播放有关,那就提到到播放器。而播放器必要二个华为平板view,而 苹果平板view 遭受半晶莹剔透属性时,难题越多。

由来,都不知道(哎,可悲)。但只要不选择半透明那么些本性,就一切平常了,但假设不用那个特性,本篇介绍的卡通方案又无可奈何完毕。这确实是鱼和熊掌不可兼得啊。

所以,作者就在想,既然 windowIsTranslucent 为 false 时,一切符合规律;为
true 时,动漫符合规律。那是还是不是有法子在动漫进程中设置为
true,动漫甘休今后设置为 false
呢?
一经得以的话,按理来讲应该偏巧消除难点。

但找了半天,未有找到相关的接口来动态设置那性格格的值,这些半透明属性值是安装在
style.xml 里的。互连网有一对介绍说:在代码动态校订 style
的,但展开那个文章你会意识,说的是动态改善,但焦点都务求只怕在
super.onCreate(卡塔尔国 此前调用,要么在 setContentLayout(卡塔尔(قطر‎ 以前,要么重写
setTheme(卡塔尔国,这么多限定,那哪个地方有用。

新兴,在找播放器黑屏的标题时,找到一篇大神写的博客:Android版与WechatActivity侧滑后退效果完全相近的SwipeBackLayout。

主题材料尽管看起来跟本篇一点提到都未曾,但作者遭逢的标题跟作者的难点本质上是一个的,也是
windowIsTranslucent
属性引致的主题材料。很开心的是,小编介绍了行使反射去调用 Activity 里的
convertFromTranslucent(卡塔尔国 和 convertToTranslucent(State of Qatar方法来动态改正这么些半晶莹剔透属性值,那八个措施是对外掩瞒的

后来,作者很好奇 5.0+
的卡通到底是怎么贯彻的这种动漫效果,因为它鲜明无需安装
windowIsTranslucent 为 true,但它的卡通片,Activity 在跳转时,上个
Activity 是可以知道的,那是怎么完结的。

自家跟踪了一片段源码,也很开心的开掘,原本它里面也是用的 Activity
里的那三个章程,在动画开端前将 Activity
设置成半晶莹剔透的,动漫甘休后装置回去。当然,内部它有权力调用 Activity
的不二等秘书诀,而作者辈从没权限,所以一定要通过反射来调用。

开心,难点解决了。大家要是通过反射,在动漫开头以前调用 Activity 的
convertToTranslucent(卡塔尔(قطر‎ 将 Activity 设置成半晶莹剔透的,动漫甘休再调用
convertFromTranslucent(卡塔尔(قطر‎设置回去,那样动画的意义达到了,又不会因为安装了 windowIsTranslucent 为
true 而引进各个主题材料。

可是,测量检验时开掘,在 api 21 以下的盒子上,那些点子没启效能。

作者去查看,相比较了下 21 以上和以下 Activity 的代码,开掘convertToTranslucent(卡塔尔国那些办法它的里边落到实处是不相符的,21及以上是一套代码,21之下至19是一套代码,19以下则是从未有过那八个艺术。

新生又细致入微看了地点大神那篇小说,发掘说,原本 19-21
的版本,那五个章程要能力所能达到生效的话,必要暗许在 style.xml 先将 Activity
设置成半透明的,而 21
及以上的,则无需。至于19以下的,就完全无法用那一个方法了。

撤销办法也相当粗略,那就在 style.xml 暗中同意设置 Activity
是半透明的,那样动漫停止今后再设回去就足以了。

不过,那样播放器就能够有题目—黑屏。原因是因为调用了
convertFromTranslucent(卡塔尔国设置不透明,一旦调用那个方法,就算该分界面有播放器,那么就能够黑屏。至于具体原因,照旧不精晓,上边比非常的大神的文章里也关乎了这几个现象,但他也不精晓什么样缓和,小编也不知道。

末段,为了减轻黑屏的主题材料,只好是只要分界面有播放器的话,那三个这么些分界面包车型地铁动漫片就换其余一种方法来完结,至于是怎么着方案也足以达成起来介绍的动漫效果,笔者就背着了,Github
上相当多,但都有同八个性格,那就是贼麻烦。

有一点总括一下,本篇提的动漫片方案适用于以下二种景况:

  1. 譬如你的使用设置了 windowIsTranslucent 为 true
    时,未有发觉什么样难题来说,那恭喜你,该动漫方案能够合作各样本子。

  2. 如果您的选用设置了 windowIsTranslucent 为 true
    时会有一对主题材料,但你的使用里未有播放器的话,那恭喜您,该动漫方案得以配合19 及以上版本。

  3. 借使您的选用设置了 windowIsTranslucent 为 true
    时会有一部分难点,何况动用里也许有播放器的话,那假诺您其实走头无路想利用该动漫方案以来,那你再来找小编啊,在探究出别的方案在此之前,大家一齐来渐渐填坑。

注:本篇侧重视是介绍一种 Activity
动漫方案的兑现思路,注意,是思路!因为本篇所介绍的卡通片方案并不成熟,仍然有为数不菲坑,所以,学习、切磋就能够,慎用!

Github 链接

上传了贰个demo,假如对这种动漫方案感兴趣的话,能够去拜望代码。跟动漫有关的代码都在
ui/anim 文件夹里。
一种 Activity
转场动漫—-点击哪里从哪放大

项目.png

遗留难点

老样子,最终再留多少个难点给我们用脑筋想一下(其实作者也不懂,还望有大神能解答一下)

Q1:overridePendingTransition(卡塔尔(قطر‎ 达成的转场动漫一点都不卡,但用 View
动漫方案来落到实处 Activity 转场动漫不常会有些卡顿,以为是 Activity
运营做的那一大堆事跟动漫挤一块了,那 overridePendingTransition()原理到底是怎么落到实处?跟着源码跳进去看认为有一点点懵,有的时候光得再研商一下这部分的源码。

Q2:Activity 切换时,平时下个 Activity 直接覆盖在本 Activity
上了,按笔者的精通,假诺对要开垦的 Activity 的 window
设置成透明属性,那应该就足以见到下层的 Activity
才对,为何欠行吗?为啥必需求设置 android:windowIsTranslucent = true
才得以呢?android 5.0 的分享成分动漫很显明能够见见下个 Activity
在缩放时,上个 Activity
是可以看到的,那么它又是怎么贯彻的吗?原理是什么呢?那有些源码看了一片段了,等领会透了点,在梳理出来。

发表评论

电子邮件地址不会被公开。 必填项已用*标注