Android开发 之 共享元素

共享元素
如果要在两个拥有共享元素的操作行为之间安排屏幕转换动画:
1.请在您的主题中启用窗口内容转换 。
true
2.在您的风格中指定一个共享元素转换 。给要共享的元素设置
3.将您的转换定义为 XML 资源 。共享元素动画可以使用xml定义
4.利用 : 属性对两个布局中的共享元素指定一个通用名称 。

Android开发 之 共享元素

文章插图
5.使用 .() 方法 。
// get the element that receives the click eventfinal View imgContainerView = findViewById(R.id.img_container);// get the common element for the transition in this activityfinal View androidRobotView = findViewById(R.id.image_small);// define a click listenerimgContainerView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(this, Activity2.class);// create the transition animation - the images in the layouts// of both activities are defined with android:transitionName="robot"ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, androidRobotView, "robot");// start the new activitystartActivity(intent, options.toBundle());}});
对于在您的代码中生成的共享动态视图 , 请使用 View.() 方法在两个操作行为中指定一个通用元素名称 。
如果要在完成第二项操作行为时反转场景转换动画 , 请调用 .n() 方法而非 .() 。
以多个共享元素启动一个操作行为
如果要在两个拥有多个共享元素的操作行为之间安排场景转换动画 , 请以 : 属性(或在两个操作行为中使用 View.() 方法)定义共享元素 , 并以下列方式创建一个对象:
Android开发 之 共享元素

文章插图
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,Pair.create(view1, "agreedName1"),Pair.create(view2, "agreedName2"))
以上是基本技术点 , 下面看实例 , 先看效果:
Android开发 之 共享元素

文章插图
代码:
package th.zxq.com.quxianyundong;import android.app.ActivityOptions;import android.content.Intent;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.SharedElementCallback;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.transition.Slide;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.view.Window;import android.view.WindowManager;import android.widget.ImageView;import java.util.List;import java.util.Map;/*** Created by Administrator on 2017/7/24.*/public class MyAnimationActivity extends AppCompatActivity {public static int[] list=new int[]{R.mipmap.tp01,R.mipmap.tp02,R.mipmap.tp03,R.mipmap.tp04,R.mipmap.tp05,R.mipmap.tp06};private RecyclerView recycle;private SharedElementCallback callback=new SharedElementCallback() {@Overridepublic void onMapSharedElements(List names, Map sharedElements) {super.onMapSharedElements(names, sharedElements);Log.e("callback","MyAnimationActivity");if(startingPosition!=currentItem){View newSharedElement = recycle.findViewWithTag(currentItem+"");if (newSharedElement != null) {names.clear();names.add(currentItem+"");sharedElements.clear();sharedElements.put(currentItem+"", newSharedElement);}}}};private int currentItem=-1,startingPosition=-1;private PicAdapter picAdapter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);setContentView(R.layout.activity_myanimation);getWindow().setEnterTransition(new Slide(Gravity.LEFT));getWindow().setExitTransition(new Slide(Gravity.LEFT));setExitSharedElementCallback(callback);recycle = (RecyclerView) findViewById(R.id.recycle);recycle.setLayoutManager(new GridLayoutManager(this,2));picAdapter = new PicAdapter();recycle.setAdapter(picAdapter);}public class PicAdapter extends RecyclerView.Adapter{@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(MyAnimationActivity.this).inflate(R.layout.item_recycle, parent, false);return new MyViewHolder(view);}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {MyViewHolder mholder= (MyViewHolder) holder;mholder.setData(position);}@Overridepublic int getItemCount() {return list.length;}}public class MyViewHolder extends RecyclerView.ViewHolder{private ImageView iv;public MyViewHolder(View itemView) {super(itemView);iv= (ImageView) itemView.findViewById(R.id.iv);}public void setData(final int position){iv.setTransitionName(position+"");iv.setTag(position+"");iv.setBackgroundResource(list[position]);iv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startingPosition=position;currentItem=startingPosition;Intent intent = new Intent(MyAnimationActivity.this, PicDetailActivity.class);intent.putExtra("transitionName",iv.getTransitionName());ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(MyAnimationActivity.this, iv, iv.getTransitionName());startActivity(intent,activityOptions.toBundle());}});}}@Overridepublic void onActivityReenter(int resultCode, Intent data) {super.onActivityReenter(resultCode, data);currentItem = data.getExtras().getInt("currentItem");if (startingPosition != currentItem) {recycle.scrollToPosition(currentItem);}postponeEnterTransition();recycle.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {recycle.getViewTreeObserver().removeOnPreDrawListener(this);// TODO: figure out why it is necessary to request layout here in order to get a smooth transition.recycle.requestLayout();startPostponedEnterTransition();return true;}});}}