参考:
Android5.0之Activity的转场动画
Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
// 必须在 StartActivity() 或 finish() 之后立即调用
Intent intent = new Intent(MainActivity.this, MainActivityI.class);
startActivity(intent);
overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
简单做一个定制的动画,这个参数很简单,传入一个进入的动画的id,和移除动画的id即可
类似于:overridePendingTransition。
//类似于:overridePendingTransition(R.anim.slide_bottom_in, R.anim.slide_bottom_out);
//还不如直接用这个全版本的overridePendingTransition
ActivityOptionsCompat options = ActivityOptionsCompat.makeCustomAnimation(MainActivity.this,
R.anim.slide_bottom_in, R.anim.slide_bottom_out);
Intent intent = new Intent(MainActivity.this, MainActivityI.class);
startActivity(intent, options.toBundle());
这个在4.x上有用,可以实现新的Activity从某个固定的坐标以某个大小扩大至全屏。
对于相册是很好的展示效果。
//让新的Activity从一个小的范围(比如第一个activity的一个按钮)扩大到全屏
ActivityOptionsCompat options = ActivityOptionsCompat.makeScaleUpAnimation(btn2,
btn2.getWidth() / 2, btn2.getHeight() / 2, //拉伸开始的坐标
0, 0);//拉伸开始的区域大小,这里用(0,0)表示从无到全屏
Intent intent = new Intent(MainActivity.this, MainActivityI.class);
startActivity(intent, options.toBundle());
当你需要当前界面中的某个元素和新界面中的元素有关时,你可以使用这个动画:
1、无共享元素:
启动activity:
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this);
Intent intent = new Intent(MainActivity.this, MainActivityI.class);
startActivity(intent, optionsCompat.toBundle());
第二个activity:
public class MainActivityI extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//设置允许使用转场动画
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maini);
// 滑动进入
Slide slide = new Slide();
slide.setDuration(2000);
getWindow().setExitTransition(slide);//出去1动画
getWindow().setEnterTransition(slide);//进来的动画
// 分解
// Explode explode = new Explode();
// explode.setDuration(2000);
// getWindow().setExitTransition(explode);//出去的动画
// getWindow().setEnterTransition(explode);//进来的动画
// 淡入淡出
// Fade fade = new Fade();
// fade.setDuration(2000);
// getWindow().setExitTransition(fade);//出去的动画
// getWindow().setEnterTransition(fade);//进来的动画
}
}
2、有一个共享元素:
①布局中共享的元素添加 android:transitionName=”mybtn1”:
②activity中
Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, btn2, "mybtn1").toBundle();
Intent intent = new Intent(MainActivity.this, MainActivityI.class);
startActivity(intent, bundle);
参数btn2:表示第一个和第二个activity中的共享元素(就是那个Button),
参数”mybtn1”:表示布局文件中transitionAnimation属性的值。
第二个activity中
①布局中共享的元素添加 android:transitionName:
注意:transitionName名称要对应且相同。
②activity中不做任何操作
3、有多个共享元素:
如果两个页面中有多个共享元素该怎么办呢?
android:transitionName属性还像上面一样设置,然后在启动Activity时我们可以通过Pair.create方法来设置多个共享元素。
启动activity:
①布局中共享的元素添加 android:transitionName属性,名称自定义:
②activity中
Bundle bundle = ActivityOptions
.makeSceneTransitionAnimation(MainActivity.this,
Pair.create(((View) btn2), "mybtn1"),
Pair.create(((View) btn3), "mybtn2"))
.toBundle();
Intent intent = new Intent(MainActivity.this, MainActivityI.class);
startActivity(intent, bundle);
Pair.create方法中有两个参数,
第一个是共享元素的实例(注意要是View类型),
第二个参数是该View的transitionAnimation属性的值。
第二个activity中
①布局中共享的元素添加 android:transitionName:
注意:transitionName名称要对应且相同。
id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="第二个界面的第一个按钮"
android:transitionName="mybtn1" />
id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="第二个界面的第二个按钮"
android:transitionName="mybtn2" />
②activity中不做任何操作