Android 共享元素动画 向下兼容android5.0版本

概述:
最近项目中需要在启动过后弹出倒计时的广告,倒计时结束后跳转到首页并实现类似共享元素动画,实现广告的图片与首页中的某个控件实现共享元素动画。

我刚接受到这个需求的时候,想到的就是android默认的共享元素动画。但在实际的开发中并不容易,主要是首页是由多个fragment实现,测试中共享元素动画就不起作用了,也不太了解这共享元素动画的原理。就在自己没有一点思路的情况下,打开百度搜索了相关文章,还真找到了,先给个链接。之所以写这篇文章是对我看的这篇文章的一个扩展。因为虽然作者写的也比较详细,但对于开发者来说。时间成本还是很宝贵的。看了他的文章 需要自己去理一下。由于作者贴的代码不是很全,所以便有了此篇文章,也同时非常感谢作者提供的宝贵的资料。

原理:
定义页面: B页面-广告倒计时页面(ActivityB),A页面(CFragment)-->寄主(ActivityA)

首先获得B页面控件的宽和高以及控件显示在屏幕中的位置,然后通过Intent传值的方式传递到A页面的碎片CFragment

       Intent intent = new Intent(ActivityB.this, ActivityA.class);
                intent.putExtra(IMAGE_URL_EXTRA, imageUrl);
                intent.putExtra(VIEW_INFO_EXTRA, /* start values */                 captureValues(imageView));
                startActivity(intent);
                overridePendingTransition(0, 0);
                finish();

 private Bundle captureValues(@NonNull View view) {
        Bundle b = new Bundle();
        int[] screenLocation = new int[2];
        view.getLocationOnScreen(screenLocation);
        b.putInt(PROPNAME_SCREENLOCATION_LEFT, screenLocation[0]);
        b.putInt(PROPNAME_SCREENLOCATION_TOP, screenLocation[1]);
        b.putInt(PROPNAME_WIDTH, view.getWidth());
        b.putInt(PROPNAME_HEIGHT, view.getHeight());
        return b;
    }

其实是通过B页面传递的数据,然后进行A页面需要共享元素控件的位移和缩放,重要的事情说一遍。就是对A页面的控件进行位移和缩放的动画 跟B页面没有半毛线关系。B页面主要是提供一些参数。具体实现动画的是在A页面。

接下来我们在看下CFragment
如果是网络图片需要在图片加载完成过后进行动画操作:

 Glide.with(this).asBitmap().load(imageUrl).into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                    mDestinationView.setImageBitmap(resource);
                    onUiReady();
                }
            });

把A页面需要共享元素控件的大小设置为B页面的显示图片的大小。也是通过位移和缩放动画 这样就可以给我们错觉,也就是由B页面控件过渡到A页面的控件 从而实现类似于共享元素动画的效果

 private void prepareScene() {

            int[] locations = new int[2];
            mDestinationView.getLocationOnScreen(locations);
            mEndXValues = locations[0];
            mEndYValues = locations[1];
            mEndWidth = mDestinationView.getWidth();
            mEndHeight = mDestinationView.getHeight();
            mDestinationView.setScaleX(getScaleX());
            mDestinationView.setScaleY(getScaleY());
            mDestinationView.setTranslationX(getDeltaX());
            mDestinationView.setTranslationY(getDeltaY());
        }



 private void runEnterAnimation() {
            // We can now make it visible
            mDestinationView.setVisibility(View.VISIBLE);
            // finally, run the animation
            mDestinationView.animate()
                    .setDuration(DEFAULT_DURATION)
                    .setInterpolator(DEFAULT_INTERPOLATOR)
                    .scaleX(1f)
                    .scaleY(1f)
                    .translationX(0)
                    .translationY(0)
                    .start();
        }

        private float getScaleX(){
            return scaleDelta(mStartWidth, mEndWidth);
        }

        private float getScaleY(){
            return scaleDelta(mStartHeight, mEndHeight);
        }

        private int getDeltaX(){
            return translationDelta(mStartXValues, mEndXValues);
        }

        private int getDeltaY(){
            return translationDelta(mStartYValues, mEndYValues);
        }

        private int translationDelta(int startPosition,int endPosition){
            return startPosition - endPosition;
        }

        private float scaleDelta(int startValue,int endValue){
            if (endValue == 0)return 1;
            return startValue/(endValue * 1.0f);
        }

核心代码就是这些,当然了退出页面A页面 进入到B页面也需要退出动画。具体调用是在按返回键或则home键

        private void runExitAnimation() {
            mDestinationView.animate()
                    .setDuration(DEFAULT_DURATION)
                    .setInterpolator(DEFAULT_INTERPOLATOR)
                    .scaleX(getScaleX())
                    .scaleY(getScaleY())
                    .translationX(getDeltaX())
                    .translationY(getDeltaY())
                    .withEndAction(new Runnable() {
                        @Override
                        public void run() {
                            mActivity.finish();
                            mActivity.overridePendingTransition(0, 0);
                        }
                    }).start();
        }

直接复制就可以用了
如有需要 源码链接附上 写的不是很规范还望谅解 :

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 【Android 动画】 动画分类补间动画(Tween动画)帧动画(Frame 动画)属性动画(Property ...
    Rtia阅读 6,152评论 1 38
  • 最近睡眠质量非常不好,睡得晚醒得早,晚上总是做梦,白天感觉非常疲惫。之前在父亲身上也看到过这样的情形,那时我还在上...
    半坡居士泉城阅读 216评论 3 1
  • 成长也许是不断地发现, 发现可能与不可能之间原来是那么界限分明, 发现所有的事情的可能性都近乎于冰冷的存在, 发现...
    ZHOUTREEMAN阅读 210评论 0 0
  • 日出东海落西山 愁也一天喜一天 常与知友聊诗仙 谈古道今夜至深 群里少友互慰勉 贫富不管诗连篇
    依山赏月阅读 274评论 20 33
  • 我们一直说多学多练,以为这样就是可以真正学会或者掌握一项技能,练习是必须的,可是我们所认为的练习是真正有效的练习吗...
    雨夜寄北阅读 185评论 0 0