【问题标题】:new Shared Transition API not working for Imageview from One recycler view to another新的共享转换 API 不适用于从一个回收器视图到另一个回收器视图的 Imageview
【发布时间】:2016-04-08 06:20:50
【问题描述】:

我正在尝试实现 sharedElement 以将 imageView 从一个活动设置为另一个活动,但我的问题是我的 imageView 在 recyclerView 标头内,因此它不会设置动画。

所以我的问题是,有没有办法做到这一点?

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

代码: 在开始第二个活动时

 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));

我的第一个活动网格和第二个活动recyclerView Header

【问题讨论】:

  • 你需要有recycler view的activity来执行共享元素动画,这需要在RecycleViewAdapter的onCreateViewHolder的OnClickListener中实现。
  • recyclerview 的活动是什么意思?
  • recyclerview 所属的活动。
  • 如果能贴出代码就很容易解决了
  • 添加代码请看

标签: android android-5.0-lollipop android-transitions


【解决方案1】:

如果您的 First acitivty imageview 过渡名称必须是唯一的,过渡动画才能正常工作。在 Recycler 网格的 onBindView 方法中,您必须使用以下代码分别为每个图像视图分配转换名称

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

我将位置添加到每个网格图像过渡名称以使其唯一。

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

此转换名称应与您在第二个活动中分配给 Recycler 视图标题的转换名称相同

    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);

【讨论】:

  • 好的,让我试试这个,这是通过 prelollipop 转换 api 支持的 prelollipop 吗
  • 你可以发布一个示例代码,它适用于活动之间的 recyclerview 标头,我不知道为什么它不适合我,可能我做错了什么
  • 只要给我看你的代码,我就会知道我能做什么
  • 它不工作只有退出转换工作而不是进入一个
  • 你的第一个布局是网格视图吗?
【解决方案2】:

如果您的 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);

    }
} 

在适配器类中,

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 代码在适配器类中实现。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多