新的共享转换 API 不适用于从一个回收器视图到另一个回收器视图的 Imageview

new Shared Transition API not working for Imageview from One recycler view to another

我正在尝试实现 sharedElement 以将 imageView 从一个 activity 动画化到另一个,但我的问题是我的 imageView 在 recyclerView header 内,所以它没有动画。

所以我的问题是,有没有办法实现这个目标?

我在 PlayStore 上看到很多应用都这样做

代码: 开始第二个 activity

 String transitionName = getString(R.string.demo);

ActivityOptionsCompat transitionActivityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(mContext, v, transitionName);
startActivity(intent, transitionActivityOptions.toBundle());

我已经设置:

ViewCompat.setTransitionName(icon, convertView.getContext().getString(R.string.demo));

到我的第一个 activity 网格和第二个 activity recyclerView Header

如果您的第一个活动 imageview 转换名称必须是唯一的,转换动画才能工作。在 Recycler grid onBindView 方法中,您必须使用以下代码分别为每个图像视图分配转换名称

holder.gridImageView.setTransitionName("gridImageTransition" + position);

正在将位置添加到每个网格图像转换名称以使其唯一。

在 ActivityOptionsCompat transitionActivityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(mContext, v, transitionName);

此转换名称应与您在第二 activity 中使用

分配给 Recycler 视图 header 的转换名称相同
    You will have to set the sharedTransition name for the imageView in your header after it has been inflated. Like below. Setting in xml wont work for the reason that it wont be immediately inflated.

在回收器适配器的 onBindViewHolder 中使用

 holder.imageView.setTransitionName(transition);

如果您的 MainActivity 有这样的 RecyclerView 适配器:

public class MainActivity extends Activity {
    private SampleRecyclerViewAdapter adapter;    

    public void onCreate(Bundle savedBundle) {
        RecyclerView recycleView = (RecyclerView) findViewById(R.id.recycle_view);
        SampleRecyclerViewAdapter(this);
        recycleView.setAdapter(adapter);

    }
} 

在适配器中 Class,

public class public class SampleRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    Context mContext;
    public SampleRecyclerViewAdapter(Context ctx) {
        this.mContext = ctx;
    }
    @Override
    public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Initiate ViewHolder and return it.
        return null;
    }    
    @Override
    public void onBindViewHolder(VH viewHolder, int i) {
        viewHolder.view.setOnClickListener(
        new OnClickListener() {
            @Override
            public void onClick() {
                ActivityOptionsCompat transitionActivityOptions =
                ActivityOptionsCompat.makeSceneTransitionAnimation(this.mContext, viewHolder.view, transitionName);
                startActivity(intent, transitionActivityOptions.toBundle());
                ViewCompat.setTransitionName(icon, convertView.getContext().getString(R.string.demo));
            }
        }
        );
    }
}

在此代码中,SharedElementTransition 代码在适配器 class 中实现。