澳门新葡亰平台官网Twitter iOS App 启动动画的实现

澳门新葡亰平台官网 6

当作者首先次张开 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 >= 16卡塔尔
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
类钦定的有的转场动漫了,Google为大家封装了生机勃勃部分动漫接口,大家就来拜望它支持什么转场。

ActivityOptions动画接口列表.png

之所以,上面就来说讲 makeScaleUpAnimation() 放大动漫和
makeSceneTransitionAnimation()
分享成分动漫。因为临近独有那三个能够兑现初阶效果图显示的动漫效果。

对了,上上海体育场地中的 ActivityOptionsCompat 类功效的 ActivityOptions
同样,只是后面一个是 Google 为我们提供的三个相配完结,因为那是 5.0+
动漫,那么在 5.0 以下的版本就不能够应用了,所以 谷歌(GoogleState of Qatar提供了杰出管理,让多少动漫可以帮助更低版本,动漫效果都相似,至于里面具体是怎么贯彻,有意思味能够去看看。但亦非享有的卡通片都做到宽容管理的,像
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(卡塔尔(قطر‎。

  2. startActivity(IntentState of Qatar 换到 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(卡塔尔(قطر‎.getDecorView(卡塔尔来拿到到它的引用啊

再不然,咱俩 setContentLayout(卡塔尔 都是将和煦写的构造文件设置到四个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, 0卡塔尔(قطر‎ 传入 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(State of Qatar的吗,既然那样,在基类里重写一下以此法子:

@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(State of Qatar操作。

时至不久前,发轫所展现的成效图的卡通片效果已经完成。

但您感到事情做完了么?不,填坑之路才刚初始!(哭丧脸)

优化之路,又名填坑之路

本人前边说过,这种方案一定要算是生机勃勃种一时半刻的代替方案,知道作者何以这么说么?因为这种方案达成是会超出太多坑了。

1.卡通的流畅性难点

首先是动漫片的流畅性难题,本篇里演示的 gif
图之所以看起来还很流畅,是因为切换的三个 Activity
分界面都太轻便了,但界面布局复杂一点时,张开三个 Activity
分界面包车型大巴度量、布局、绘制甚至大家在 onCreate(State of Qatar里写的有的加载数据、互联网央求操作跟放大动漫都挤到三只去了,以致网络央浼回来后更新分界面时动漫都还会有希望在实行中,那样动漫的通畅性就更惨了。

在优化时,找到三个大神的意气风发篇小说:风度翩翩种新的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,说真的,这么些回调第1回见,作者也十分的小清楚它的回调机缘是如何,作用是怎么样,网络的表达也摸棱两可,没看了解,待继续不常间友赏心悦目看源码好了。

但本人能够跟你们一定的是,小编看了生机勃勃局地 5.0+ 动漫源码,它在那之中也是在一个Activity 的 onStart(State of Qatar 方法里登记了 onPreDraw(卡塔尔(قطر‎回调监听,然后在回调时进行 5.0+
的动漫片。但它里面做的事,远不唯有这个,实乃太多了,预计是展开的局地优化操作,小编当下是还尚没本领去搞懂。
但大家动漫试行的时机是亟需换一下了,想转手也知晓,在 onCreate(卡塔尔(قطر‎里做动漫,听着就感到微微奇异。既然大神,还应该有 Google 官方都是在
onPreDraw(卡塔尔 里推行,那我们本来能够效仿学习。

看 5.0+ 源码进程中,开采它在动漫开端和得了前会调用二个 ViewGroup 的
suppressLayout(State of Qatar 方法,那一个形式是隐形的:

suppressLayout.png

那是一个隐讳的秘诀,大家要调用的话,就供给通过反射的章程。那么些形式的笺注大致是说禁绝ViewGroup 实行 layout()操作。那样的话,大家有一个得以优化的地点,大家能够在动漫早先时调用那些点子防止layout(卡塔尔(قطر‎ 操作,动漫停止时上涨。

如此做的功利是,动漫施行进度中,假设网络或本地数据已经回调,公告 adapter
去刷新 view 时,那样会导致动画很卡顿。所以,当大家用 suppressLayout(卡塔尔(قطر‎做了优化以后,就只有等动漫片甘休的时候分界面才会去重新 layout
刷新构造,优化动画流畅性。

但与此相类似做也是有一个标题是,要是你在 onCreate(卡塔尔 或 onResume()之类的法子发起多少个 requestFocus(卡塔尔国操作的话,很有不小可能率那个操作会被放任掉,招致界面理应拿到大旨的 view
发生错乱难点。

有关原因,因为对 suppressLayout(卡塔尔(قطر‎ 也还不是很明白,思虑等对 onPreDraw()领会了随后协作钻探一下。

2.windowIsTranslucent 半透明引发的难点
哇,那本天性,真的是。。。
你们好奇的话,就英特网搜一下这一个半透明属性,一群种种难点。但实则,网络蒙受的那贰个难题,笔者基本都没蒙受过,但作者境遇的是更奇葩,英特网没找到施工方案的主题材料,哭瞎。

emmm,小编是做 Tv 应用开荒的,windowIsTranslucent
那么些在不相同的盒子上海展览中心现的效应不等同,大约了。

在设置了 android:windowIsTranslucent=true
时,有的盒子分界面就能够是透明的,纵然你设置了一张不透明的背景图,但发光度不会很刚毅。
一部分盒子则是在新的 Activity 展开时,借使 view
未有完全加载出来,则会来得上个 Activity 的分界面,形成的情景就是开荒新
Activity 时,会须臾间闪过上个分界面包车型地铁镜头。

再有,Tv 应用经常都会跟录像播放有关,那就关乎到播放器。而播放器必要一个三星平板view,而 三星GALAXY Tabview 遇到半晶莹剔透属性时,难点越来越多。

缘由,都不明了(哎,可悲)。但纵然不行使半透明那些特性,就一切平常了,但假设不用这几个天性,本篇介绍的动漫片方案又万般无奈实现。那着实是鱼和熊掌不可兼得啊。

据此,笔者就在想,既然 windowIsTranslucent 为 false 时,一切寻常;为
true 时,动漫不荒谬。那是否有艺术在动漫进度中设置为
true,动漫截至将来设置为 false
呢?
如果能够的话,按理来讲应该适逢其时消弭难题。

但找了半天,未有找到相关的接口来动态设置这一个天性的值,那些半晶莹剔透属性值是安装在
style.xml 里的。互连网有局地介绍说:在代码动态修改 style
的,但打开那么些小说你会意识,说的是动态校勘,但宗旨都需求或然在
super.onCreate(卡塔尔国 在此以前调用,要么在 setContentLayout(卡塔尔国 在此以前,要么重写
setTheme(卡塔尔国,这么多约束,这何地有用。

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

标题纵然看起来跟本篇一点涉及都不曾,但作者蒙受的难题跟本人的主题素材本质上是三个的,也是
windowIsTranslucent
属性引致的标题。很欢乐的是,笔者介绍了利用反射去调用 Activity 里的
convertFromTranslucent(卡塔尔国 和 convertToTranslucent()方法来动态修正这些半透明属性值,那多个措施是对外隐敝的

后来,笔者很好奇 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
是可知的,那么它又是怎么贯彻的吧?原理是何许啊?那生龙活虎部分源码看了大器晚成局地了,等驾驭透了点,在梳理出来。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图