在Android开发过程中,经常会碰到Activity之间的切换效果的问题 ,从Android2.0开始在Activity增加了一个方法:
public void overridePendingTransition (int enterAnim, int exitAnim)
其中:
enterAnim 定义Activity进入屏幕时的动画
exitAnim 定义Activity退出屏幕时的动画
overridePendingTransition 方法必须在startActivity()或者 finish()方法的后面。
但是这种老旧、生硬的方式怎么能适合我们的MD风格的App呢!好在google在新的sdk中给我们提供了另外一种Activity的过度动画—ActivityOptions
。并且提供了兼容包——ActivityOptionsCompat
。这篇博客我们就是来了解下这个新的activity过度机制。
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<View, String>… sharedElements)
package demo.my.com.myapidemo.app.ui;
import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import demo.my.com.myapidemo.R;
/**
* Created by Hack on 2015/10/21.
*/
public class Animation extends Activity {
private static final String TAG = "apidemo";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
// 获取点击按钮
Button button = (Button)findViewById(R.id.fade_animation);
button.setOnClickListener(mFadeListener);
button = (Button)findViewById(R.id.zoom_animation);
button.setOnClickListener(mZoomListener);
// SDK的版本判断 android.os.Build.VERSION_CODES.JELLY_BEAN:4.2及以上版本
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
button = (Button)findViewById(R.id.modern_fade_animation);
button.setOnClickListener(mModernFadeListener);
button = (Button)findViewById(R.id.modern_zoom_animation);
button.setOnClickListener(mModernZoomListener);
button = (Button)findViewById(R.id.scale_up_animation);
button.setOnClickListener(mScaleUpListener);
button = (Button)findViewById(R.id.zoom_thumbnail_animation);
button.setOnClickListener(mZoomThumbnailListener);
} else {
findViewById(R.id.modern_fade_animation).setEnabled(false);
findViewById(R.id.modern_zoom_animation).setEnabled(false);
findViewById(R.id.scale_up_animation).setEnabled(false);
findViewById(R.id.zoom_thumbnail_animation).setEnabled(false);
}
}
//淡入淡出效果 旧式overridePendingTransition
private View.OnClickListener mFadeListener = new View.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(Animation.this, HelloWorld.class));
overridePendingTransition(R.anim.fade, R.anim.hold);
}
};
//缩放效果 旧式
private View.OnClickListener mZoomListener = new View.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(Animation.this, HelloWorld.class));
overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
}
};
//淡入淡出效果 新式,使用ActivityOptions
private View.OnClickListener mModernFadeListener = new View.OnClickListener() {
public void onClick(View v) {
ActivityOptions opts = ActivityOptions.makeCustomAnimation(Animation.this,
R.anim.fade, R.anim.hold);
startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());
}
};
private View.OnClickListener mModernZoomListener = new View.OnClickListener() {
public void onClick(View v) {
ActivityOptions opts = ActivityOptions.makeCustomAnimation(Animation.this,
R.anim.zoom_enter, R.anim.zoom_enter);
startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());
}
};
private View.OnClickListener mScaleUpListener = new View.OnClickListener() {
public void onClick(View v) {
ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(
v, 0, 0, v.getWidth(), v.getHeight());
startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());
}
};
private View.OnClickListener mZoomThumbnailListener = new View.OnClickListener() {
public void onClick(View v) {
v.setDrawingCacheEnabled(true);
v.setPressed(false);
v.refreshDrawableState();
Bitmap bm = v.getDrawingCache();
ActivityOptions opts = ActivityOptions.makeThumbnailScaleUpAnimation(
v, bm, 0, 0);
startActivity(new Intent(Animation.this, HelloWorld.class), opts.toBundle());
v.setDrawingCacheEnabled(false);
}
};
}
xml文件:
zoom_enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale android:fromXScale="2.0" android:toXScale="1.0"
android:fromYScale="2.0" android:toYScale="1.0"
android:pivotX="50%p" android:pivotY="50%p"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
fade.xml
fromAlpha起始动画透明度
toAlpha结束动画透明度
取值:0.0~1.0之间的浮点型数值
0:完全透明1:不透明
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_longAnimTime" />
hold.xml
整型值:
fromXDelta 属性为动画起始时 X坐标上的位置
toXDelta 属性为动画结束时 X坐标上的位置
fromYDelta 属性为动画起始时 Y坐标上的位置
toYDelta 属性为动画结束时 Y坐标上的位置
注意:
没有指定,
默认是以自己为相对参照物
长整型值:
duration 属性为动画持续时间
说明: 时间以毫秒为单位
在这些属性里面还可以加上%和p,例如:
android:toXDelta="100%",表示自身的100%,也就是从View自己的位置开始。
android:toXDelta="80%p",表示父层View的80%,是以它父层View为参照的。
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="0" android:toXDelta="0"
android:duration="@android:integer/config_longAnimTime" />
参考文章:
http://blog.youkuaiyun.com/menxu_work/article/details/10258787
http://www.bkjia.com/Androidjc/1049811.html