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();
}
};
接下来研究下共享元素怎么搭配路由跳转
原创,欢迎讨论和反馈