在两个fragment中的recylerView使用ShareElements的简单笔记

1:类似渐变的Fade()

2:忘了是Siled()还是explode();

2:

总体描述一下这个动画,这是两个fragment,第一个framgent有一个recylerview,第二个framgnet是一个不同的页面就一个图片和textview。可以看到以一个页面recylerview的item的界面和第二个界面的布局类似,在数据传递的时候可以传递同一个对象数据,甚至是同一个view对象。这是我的理解。两个界面切换的时候,把这两个view当做共享元素。

第一步,在第二个xml布局中加入共享名称标签,我这里两个界面用的同一个图片,就在imageview中加入

android:transitionName="@string/transition"

第二部,在第一个界面的recyler的onCreateView中设置viewHold的transitionName

holder.getImageView().setTransitionName(position+"img");

或者

ViewCompat.setTransitionName(holder.getImageView(), String.valueOf(position) + "img")

这里解释下为什么要这样设置,共享元素两个界面的TransitionName必须一样,如果是普通的两个activity或者fragement直接在布局写死就好,但是因为recylerview和listview的item布局是复用,就要让每一个item的setTransitionName不一样,后面加的“img”可以是任何值,但不能和其他view的值相同

第三部,写一个进行变换操作的类,这一部分我也不知道知道主要是什么意思,后期慢慢研究吧,先备个份

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class DetailTransition extends TransitionSet {
    public DetailTransition() {
        init();
    }

    // 允许资源文件使用
    public DetailTransition(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        setOrdering(ORDERING_TOGETHER);
        addTransition(new ChangeBounds()).
                addTransition(new ChangeTransform()).
                addTransition(new ChangeImageTransform());
    }
}

第四部在进行framgment事务之前加上操作

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                detailFragment.setSharedElementEnterTransition(new DetailTransition());
                setExitTransition(new Fade());
                detailFragment.setEnterTransition(new Fade());
                detailFragment.setSharedElementReturnTransition(new DetailTransition());
            }

共享元素貌似要棒棒糖后才生效

然后在事务中添加

.addSharedElement(holder.getImageView(), getResources().getString(R.string.transition))
                    

第一个参数,第一个界面共享元素的view,第二个参数第二个界面的transitionName,这里可以不止是加一个view,也可以加多个

这样就完成了共享元素的所有操作。

贴上我在fragment跳转时的所有代码

    private MyViewOnClickListener mListener = new MyViewOnClickListener() {
        @Override
        public void onClickedView(MyGridViewHolder holder, int position) {
            DetailFragment detailFragment = DetailFragment.newInstance(position);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                detailFragment.setSharedElementEnterTransition(new DetailTransition());
                setExitTransition(new Fade());
//设置进入fragment和退出framgment的动画 还有silde(),explode()
                detailFragment.setEnterTransition(new Fade());
                detailFragment.setSharedElementReturnTransition(new DetailTransition());
            }
            Bundle bundle = new Bundle();
            bundle.putSerializable("val", new bean(mData.get(position).name,
                    mData.get(position).url));
            detailFragment.setArguments(bundle);
            getActivity().getSupportFragmentManager().beginTransaction()
                    .addSharedElement(holder.getImageView(), getResources().getString(R.string.image_transition))
                    .addSharedElement(holder.getTextView(), getResources().getString(R.string.tv_transition))
                    .replace(R.id.main_cl_container, detailFragment)
                    .addToBackStack(null)
                    .commit();
        }
    };

接下来研究下共享元素怎么搭配路由跳转

原创,欢迎讨论和反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值