一、 简介
ActivityOptionsCompat是一个静态类,提供了为数不多的几个方法,下面我们来罗列一下:
1.
ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)
2.
ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)
3.
ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)
4.
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)
5.
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity,Pair… sharedElements)
恩,就这5个方法可以调用,也就是说为我们提供了这么5中过度方式,在使用的时候我们需要在theme指定:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
当然也可以在theme中设置
接下来我们就一一进行了解一下
二、 makeCustomAnimation
public void click(View view) {
ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(this,
R.anim.translate_in,R.anim.translate_none);
ActivityCompat.startActivity(this,
newIntent(this,Activity2.class),compat.toBundle());
}
三个参数,第一个是指当前activity,第二个和第三个参数分别是进入动画和退出动画,需要注意的是我们启动activity的方式是使用ActivityCompat.startActivity,最后一个参数我们使用compat.toBundle。
三、makeScaleUpAnimation
private voidlaunch(View view) {
ActivityOptionsCompat compat = ActivityOptionsCompat.makeScaleUpAnimation(view,
view.getWidth() /2,view.getHeight() /2,0,0);
ActivityCompat.startActivity(this, newIntent(this,Activity2.class),
compat.toBundle());
}
说明下几个参数,第1个参数是scale哪个view的大小,第2和3个参数是以view为基点,从哪开始动画,这里是该view的中心,4和5参数是新的activity从多大开始放大,这里是从无到有的过程。
(0,0)代表从无到最大
四、makeThumbnailScaleUpAnimation
该方法和上面的makeScaleUpAnimation非常相似,只不过,这里是通过放大一个图片,最后过度到一个新的activity,第2个参数是指那个图片要放大,3和4参数表示从哪开始动画,使用方法很简单,这里就不演示了。
五、makeSceneTransitionAnimation
private voidlaunch(View view) {
ActivityOptionsCompat compat =
ActivityOptionsCompat.makeSceneTransitionAnimation(this,view,getString(R.string.transition));
ActivityCompat.startActivity(this, newIntent(this,Activity2.class),compat.toBundle());
}
前两个参数不用说了,那第三个参数是什么?是这样的?因为要协作动画的两个view在不同的activity中,那我们怎么指定是哪两个view呢?这里android
给我们提供了一个新xml配置项android:transitionName用来指定哪些view进行写作,
可以通过setTransitionName()来设置,(ps:值无所谓 ,只是一个标示)
六、 多个view的协作 makeSceneTransitionAnimation
private voidlaunch() {
Pair imagePair = Pair.create(mImageView,getString(R.string.image));
Pair textPair = Pair.create(mTextView,getString(R.string.name));
ActivityOptionsCompat compat = ActivityOptionsCompat
.makeSceneTransitionAnimation(this,imagePair,textPair);
ActivityCompat.startActivity(this, newIntent(this,Activity2.class),
compat.toBundle());
}
原理同上 只不过变成了多个view 所以在设置跳转的时候有些改动
在跳转之后的activity中 获取相应的view 然后设置与跳转的activity中相应view的相同的transitionName值 就ok了
imageView= (ImageView) findViewById(R.id.ShowImageView);
imageView.setTransitionName("pic");
imageView.setImageDrawable(getDrawable(R.mipmap.p1_2));
在退出的时候
finishAfterTransition();
ps:在这两个activity的设置
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(newExplode().setDuration(1000));
getWindow().setExitTransition(newExplode());
setContentView(R.layout.activity_show);
这个问题在文章最前面已经提起过 可以在theme中设置 也可以在代码中设置