RecyclerView 中的共享元素转场

15

我试图在RecyclerView上使用共享元素转换,但似乎不起作用。

这是我的适配器的一部分,其中我使用了makeSceneTransitionAnimation()

public void onBindViewHolder(final BookViewHolder holder, final int position) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, DetailsActivity.class);
                ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity)context , holder.smallThumbnail, "thumbnailTransition");
                context.startActivity(intent, optionsCompat.toBundle());
            }
        }
}

以下是有关编程的内容,请将其从英文翻译成中文。只返回翻译后的文本:还请附上您的DetailsActivity代码。 - Manthan Patel
你可以看一下这个教程:https://github.com/codepath/android_guides/wiki/shared-element-activity-transition - vinay Maneti
@vinayManeti 看起来代码是一样的,只不过那里是在一个活动中使用,而我是在适配器中使用它。 - RandomyzeEverything
@user3333848 在DetailsActivity中没有与转换相关的内容。我只是在那里显示一个ImageView。 - RandomyzeEverything
2个回答

22

在你的适配器中

holder.smallThumbnail.setTransitionName("thumbnailTransition");
Pair<View, String> pair1 = Pair.create((View) holder.smallThumbnail, holder.smallThumbnail.getTransitionName());

ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation((Activity) mContext, pair1, pair2);
mContext.startActivity(intent, optionsCompat.toBundle());

在您的详细活动中
getWindow().setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.shared_element_transation));
mainImage.setTransitionName("thumbnailTransition");

这里的mainimage是ImageView,您想将其转换为之前活动的缩略图。

shared_element_transition会在res>transition中创建一个XML文件。

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500">
<changeBounds />
<fade />
</transitionSet>

我在(Activity) mContext处遇到了ClassCastException,提示“无法将Application转换为Activity”。 - RandomyzeEverything
你可以使用活动上下文来传递应用程序上下文到适配器中,或者第二种方法是创建回调接口并在活动中编写代码。 - Manthan Patel
如何传递一个活动上下文而不是应用程序上下文? - RandomyzeEverything
使用ActivityName.this代替getApplicationContex(),当你向适配器传递上下文时。 - Manthan Patel
9
Pair2是什么? - Kzaf

0

使用Picasso

适配器

holder.smallImageView.setTransitionName("transition_name");
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(context, holder.smallImageView, "transition_name");

Intent intent = new Intent(context, DetailActivity.class);
context.startActivity(intent, optionsCompat.toBundle());

详细活动(DetailActivity)
Picasso.with(context)
    .load(url)
    .into(bigImageView, new Callback() {
        @Override
        public void onSuccess() {
            bigImageView.setTransitionName("transition_name");
            getWindow().setSharedElementEnterTransition(TransitionInflater.from(context).inflateTransition(R.transition.shared_element_transition));
        }

        @Override
        public void onError() {

        }
    });

res/transition/shared_element_transition.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500">
    <changeBounds />
    <fade />
</transitionSet>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接