【问题标题】:Return Shared Element Transition after ImageView changesImageView 更改后返回共享元素转换
【发布时间】:2016-03-31 10:54:45
【问题描述】:

我在 2 个片段之间有一个完全可用的共享元素转换,比如说 A 到 B,它们都共享一个 ImageView。一切正常,除非我替换 B 上的共享 ImageView。目前我正在使用以下代码对其进行更改:

Glide.with(getActivity())
                .load(getArguments().getString(Constants.APPVIEW_FEATURE_IMAGE_URL)).asBitmap()
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                        if (getView() != null) {
                            ((ImageView) getView().findViewWithTag(Constants.TAG_FGRAPHIC)).setImageBitmap(resource);
                        }
                    }
                });

我将我从 B 上的 A 收到的 ImageView 替换为更高定义的 ImageView,因为这是一个从 listView 扩展到全宽标题的标题图像。

问题是,当从 B 返回到 A 时,动画会出错,因为当我按下返回时,图像会立即将大小更改为 A 上的大小,而不是使用动画从 B 大小缩小到 A 大小。它仍然正确地从标题移动到A位置,只是大小问题。

如果我不替换图像,则不会发生任何问题,一切正常。

有什么想法吗?谢谢。

【问题讨论】:

    标签: android animation imageview fragment shared-element-transition


    【解决方案1】:

    我不知道如何用 Glide 做到这一点,但这是我用 Picasso 做到的。

                 Picasso.with(context)
                        .load(AppController.getInstance().getThumbor().buildImage(url)
                                .resize(widthPlaceholder, heightPlaceholder)
                                .fitIn()
                                .toUrl())
                        .placeholder(R.color.light_gray)
                        .centerCrop()
                        .noFade()
                        .config(Bitmap.Config.RGB_565)
                        .into(target);
    
                Target target = new Target() {
    
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                        Drawable d = new BitmapDrawable(context.getResources(), bitmap);
                        Picasso.with(context)
                                .load(AppController.getInstance().getThumbor().buildImage(url)
                                        .resize(width, height)
                                        .fitIn()
                                        .toUrl())
                                .placeholder(d)
                                .centerCrop()
                                .noFade()
                                .config(Bitmap.Config.RGB_565)
                                .into(imageView);
                    }
    
                    @Override
                    public void onBitmapFailed(Drawable errorDrawable) {
                        Picasso.with(context)
                                .load(AppController.getInstance().getThumbor().buildImage(url)
                                        .resize(width, height)
                                        .fitIn()
                                        .toUrl())
                                .placeholder(R.color.light_gray)
                                .config(Bitmap.Config.RGB_565)
                                .centerCrop()
                                .noFade()
                                .into(imageView);
                    }
    
                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) {
                        Picasso.with(context)
                                .load(AppController.getInstance().getThumbor().buildImage(url)
                                        .resize(width, height)
                                        .fitIn()
                                        .toUrl())
                                .placeholder(placeHolderDrawable)
                                .config(Bitmap.Config.RGB_565)
                                .centerCrop()
                                .noFade()
                                .into(imageView);
                    }
                };
    

    我正在加载分辨率较低的图片,并将其作为占位符(背景图片),而不是触发更高分辨率的图片加载。

    【讨论】:

    • (我没有在我的项目中使用毕加索,所以我没有测试你的代码,但我没有使用 Glide 库来更改图像,只是使用 ImageView 本机方法(尝试了 setImageDrawable( ) 和 setImageBitmap()) 并且它也不起作用,所以我怀疑它是否会起作用。可能必须更改一些 ImageView 设置或添加一些不规则的东西到过渡
    • 尝试在按下后和调用 super.onBackPressed 之前在 ImageView 中设置较小的图像。
    • 提出了 onBackPressed 建议,但没有奏效。虽然它最初在一些短暂的毫秒内开始正确,然后发生了很多奇怪的事情(图像很快进入屏幕中间,然后主要片段动画开始(这里应该没有动画),然后图像再次跳转到她的最终地方)。不知道还能做什么:/
    • 我没有主意了。我遇到了同样的问题,我记得由于某种原因,它与 Picasso 的效果要好得多。
    • 所以这是模拟器上的一个错误,在真实设备上它可以正常工作。因此浪费了这么多时间......无论如何感谢您的帮助=)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2017-02-06
    • 1970-01-01
    • 2017-01-12
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多