ShareElement

#ShareElement
什么是共享元素变换?
元素共享式变换(shared Element transition) 决定了共享的view元素从一个Activity/Fragment 到另一个Activity/Fragment 的切换时如何动画变化的。共享元素在被调用Activity进入和返回时播放动画,共享元素在进入和返回时的变换效果通过window和Fragment的如下的方法来设置:
进入:
setShareElementEnterTransition()
设置在B进入时播放的动画,共享元素以A中的位置作为起始,B中的位置为结束来播放动画。
返回:
setShareElementReturnTransition()
设置在b返回A时 的动画,共享元素以B中的位置作为起始,A中的位置为结束来播放动画。

废话不多说上代码(从Fragment里面设置要共享的元素跳转到里一个Activity的代码如下可参照):

BranchDetialFragment branchDetialFragment = new BranchDetialFragment();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){

// branchDetialFragment.setSharedElementEnterTransition(new DetialTransition());
// setExitTransition(new Fade());
// branchDetialFragment.setSharedElementReturnTransition(new DetialTransition());
// setEnterTransition(new Fade());
///
// 另一种写法 关于shareElement的//
///
setSharedElementReturnTransition(TransitionInflater.from(
getActivity()).inflateTransition(R.transition.change_image_trans));
setExitTransition(TransitionInflater.from(
getActivity()).inflateTransition(android.R.transition.fade));

        branchDetialFragment.setSharedElementEnterTransition(TransitionInflater.from(
                getActivity()).inflateTransition(R.transition.change_image_trans));
        branchDetialFragment.setEnterTransition(TransitionInflater.from(
                getActivity()).inflateTransition(android.R.transition.fade));

        transitionName = ivImageView.getTransitionName();
        tvTitleTransition = tvTitle.getTransitionName();
    }
    bundle.putSerializable("key", (Serializable) dataBeen);
    bundle.putString("name1",transitionName);
    bundle.putString("name2",tvTitleTransition);

    branchDetialFragment.setArguments(bundle);


    fragmentManager
            .beginTransaction()
            .replace(R.id.container,branchDetialFragment,"BranchDetialFragment")
            .addToBackStack("Payment")
            .addSharedElement(ivImageView,transitionName)
            .addSharedElement(tvTitle,tvTitleTransition)
            .commit();

跳转目标Activity界面中的代码:
public class BranchDetialFragment extends Fragment {

private TextView tvTitle;
private TextView tvContent;
private ImageView ivImageView;
private List<BranchBean.DataBean> list;
private String transition ;
private String transition2;

public BranchDetialFragment() {
    // Required empty public constructor
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Bundle bundle = getArguments();
    list = ((List<BranchBean.DataBean>) bundle.get("key"));
    transition = bundle.getString("name1");
    transition2 = bundle.getString("name2");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    getActivity().setTitle("dajiahao");
    View view = inflater.inflate(R.layout.fragment_branch_detial,container,false);
    tvTitle = ((TextView) view.findViewById(R.id.branch_fragment_title_detial));
    tvContent = ((TextView) view.findViewById(R.id.branch_fragment_content_detial));
    ivImageView = ((ImageView) view.findViewById(R.id.branch_fragment_imageview_detial));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
        ivImageView.setTransitionName(transition);
        tvTitle.setTransitionName(transition2);
    }
    // 把每个图片视图设置不同的Transition名称, 防止在一个视图内有多个相同的名称, 在变换的时候造成混乱
    // Fragment支持多个View进行变换, 使用适配器时, 需要加以区分

    tvTitle.setText(list.get(0).getTitle());
    tvContent.setText(list.get(0).getDesc());
    Picasso.with(getContext()).load(list.get(0).getCover()).into(ivImageView);

    return view;
}

}

如上共享元素的初始化的第一种方法(可写一个类来继承TransitionSet),代码如下:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class DetialTransition extends TransitionSet {
public DetialTransition(){
init();
}

/**
 * 允许资源文件的使用
 * @param context
 * @param attrs
 */
public DetialTransition(Context context, AttributeSet attrs){
    super(context,attrs);
    init();
}

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

}

##总结:
ShareElement涵盖的几个要点:
1、元素共享式变换(share element transition)决定了共享的View元素从一个Activity/Fragment 到里一个Activity/Fragment的切换中如何动画变换的。
2、共享元素变化取决于每个共享元素的位置、大小以及外观。
3、共享元素默认其实是在绘制整个View树结构的最上层,在一个叫ViewOverlay的东西上面。
4、共享元素变换并不是真正实现了两个Activity或者Fragment之间元素的共享,Fragment采用了不同的方法来达到相同的视觉效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值