您的位置:首页 > 移动开发 > Android开发

android基于Activity共享元素切换效果的实现

2015-08-27 10:49 477 查看
先上一张效果图:



主要用到的类有:

android.support.v4下的三个类:

ActivityOptionsCompat, ActivityCompat, ViewCompat

这三个类的主要作用就是 适配不同的android版本, 即使是在不支持这种效果的设备上也不回发生异常;

下面开始贴代码:

gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                //获取数据(AdapterView的getItemAtPosition调用的就是Adapter的getItem()....我才知道...)
                Item item = (Item) parent.getItemAtPosition(position);

                Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                //传入选中的Item对应的ID
                intent.putExtra(DetailActivity.EXTRA_PARAM_ID, item.getId());

                //主要的语句
                //通过makeSceneTransitionAnimation传入多个Pair
                //每个Pair将一个当前Activity的View和目标Activity中的一个Key绑定起来
                //在目标Activity中会调用这个Key
                ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(
                        MainActivity.this,
                        new Pair<View, String>(view.findViewById(R.id.id_iv),
                                DetailActivity.VIEW_NAME_HEADER_IMAGE),
                        new Pair<View, String>(view.findViewById(R.id.id_tv),
                                DetailActivity.VIEW_NAME_HEADER_TITLE));

                // ActivityCompat是android支持库中用来适应不同android版本的
                ActivityCompat.startActivity(MainActivity.this, intent, activityOptions.toBundle());
            }
        });
MainActiviy中其实就只有一个GridView用于展示一些简单的图片,
然后在点击Item的时候跳转到DetailActivity;

其中最总要就是这几句话:

ActivityOptionsCompat.makeSceneTransitionAnimation;

这句话创建了一个用于绑定两个Activity之间共享的View的key-value对, 说是共享View其实还是两个Activity各有一个View;

我们只是将这两个Activity中的View用同一个Key(String)绑定了,
然后系统会自动帮我们生成切换动画;

在DetailActivity也就是要跳转的Activity中也有几句重要的语句:

private void initView(){
        TransparentStyle.setTransparentStyle(this, R.color.color_primary);
        ViewHelper.initActionBar(this, getSupportActionBar(), "Transition");
        mHeaderImageView = (ImageView) findViewById(R.id.id_iv);
        mHeaderTitle = (TextView) findViewById(R.id.id_tv_title);

        //加载图片
        Picasso.with(mHeaderImageView.getContext())
                .load(mItem.getPhotoUrl())
                .noFade()
                .placeholder(R.mipmap.ic_launcher)
                .into(mHeaderImageView);

        //主要的语句---将当前Activity的View和自己定义的Key绑定起来
        ViewCompat.setTransitionName(mHeaderImageView, VIEW_NAME_HEADER_IMAGE);
        ViewCompat.setTransitionName(mHeaderTitle, VIEW_NAME_HEADER_TITLE);
    }


其中的VIEW_Name_XXX就是我们要用来绑定的Key

这个效果我是看着google的一个示例app模仿的, 把代码精简了一些...注释换成了中文

下面是我的app的链接, 和google原版的链接:
https://github.com/googlesamples/android-ActivitySceneTransitionBasic https://github.com/ssthouse/MySceneTransitionTest
注释还算是比较详细的, 新手代码写的比较乱, 轻喷....

注:

代码中有一个style包, 是用来在android4.4上实现沉浸式体验的代码, 具体可以看一下我前面的一篇blog
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: