ActivityOptionsCompat 过渡动画
makeCustomAnimation (Context context, int enterResId, int exitResId)
ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(this , R.anim.in, R.anim.out);
Intent intent = new Intent(this , MyActivity.class);
ActivityCompat.startActivity(this , intent, compat.toBundle());
makeScaleUpAnimation (View source, int startX,int startY, int width,int height) 缩放动画,可以指定位置开始缩放,这里我是在图片中间开始进行缩放的
ActivityOptionsCompat compat = ActivityOptionsCompat.makeScaleUpAnimation(
view, view.getWidth() / 2 , view.getHeight() / 2 , 0 , 0 );
Intent intent = new Intent(this , MyActivity.class);
ActivityCompat.startActivity(this , intent, compat.toBundle());
makeThumbnailScaleUpAnimation(View source, Bitmap thumbnail, int startX, int startY) 默认从图片的左上角开始缩放,可以指定偏移量
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.a4);
ActivityOptionsCompat compat =
ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, bitmap, -500 , 500 );
Intent intent = new Intent(this , MyActivity.class);
ActivityCompat.startActivity(this , intent, compat.toBundle());
makeSceneTransitionAnimation : 共享元素动画
条件一,需要布局1和布局2,有共同的元素 给这两个共同的元素设置android:transitionName属性,和id
ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(this ,
Pair.create(findViewById(R.id.img1), "noe" ),
Pair.create(findViewById(R.id.img2), "two" ));
Intent intent = new Intent(this , MyActivity.class);
ActivityCompat.startActivity(this , intent, compat.toBundle());
Scene(场景动画)
google在旧版本的API中提供了View Animation与Propery Animator两套动画系统,可是这两套动画系统都是要程序员自己编写大量的动画代码,但是在5.0版本后,程序员只需要把开始动画前的布局和结束时的布局写出来就可以了,不用再去写大量的动画代码了,这个动画就是transition 场景动画 : 我们可以把需要实现动画效果的布局或者部分布局叫做场景,我们在切换场景的时候只需要告诉它实现什么效果的动画就可以. Scene.getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) : 创建一个场景
sceneRoot : 场景的位置,就是说我这个场景的作用域,我这里是使用了MainActivity的跟布局 layoutId : 场景的布局 context : 上下文对象 TransitionManager.beginDelayedTransition(Viewgroup group) : 延迟场景变化,TransitionManager就会根据场景变化自动执行动画 TransitionManager.go(Scene scene, Transition transition) : 切换到指定的场景
scene : 场景对象 transition : 以什么动画切换场景
/**
* 两个场景对应两个布局,还给布局中的ImageView设置了transitionName的属性
*/
public class MainActivity extends AppCompatActivity {
private RelativeLayout mActivityMain;
private Scene mScene1;
private Scene mScene2;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivityMain = (RelativeLayout) findViewById(R.id.activity_main);
if (Build.VERSION.SDK_INT >= 21 ) {
mScene1 = Scene.getSceneForLayout(mActivityMain, R.layout.scene1_layout, this );
mScene2 = Scene.getSceneForLayout(mActivityMain, R.layout.scene2_layout, this );
TransitionManager.go(mScene1, new ChangeBounds());
}
}
public void click (View view) {
if (Build.VERSION.SDK_INT >= 21 && mScene1 != null ) {
TransitionManager.go(mScene2, new ChangeBounds());
}
}
public void scene2 (View view) {
if (Build.VERSION.SDK_INT >= 21 && mScene1 != null ) {
TransitionManager.go(mScene1, new ChangeBounds());
}
}
}
beginDelayedTransition
beginDelayedTransition(ViewGroup sceneRoot, Transition transition) : beginDelayedTransition不会直接就执行动画效果,需要它监听的ViewGroup对象发生了变化才会执行动画效果
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android ="http://schemas.android.com/apk/res/android"
android:id ="@+id/content"
android:layout_width ="match_parent"
android:layout_height ="match_parent"
android:orientation ="vertical" >
<Button
android:onClick ="click"
android:layout_width ="match_parent"
android:layout_height ="wrap_content"
android:text ="点我" />
<TextView
android:id ="@+id/tv"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:textSize ="25sp"
android:text ="Hello World!" />
</LinearLayout >
public class MainActivity extends AppCompatActivity {
private TextView mTv;
private LinearLayout mContent;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView () {
mTv = (TextView) findViewById(R.id.tv);
mContent = (LinearLayout) findViewById(R.id.content);
}
public void click (View view) {
int visibility = mTv.getVisibility();
if (Build.VERSION.SDK_INT >= 21 ) {
TransitionManager.beginDelayedTransition(mContent, new Slide(Gravity.RIGHT));
}
mTv.setVisibility(visibility == View.VISIBLE ? View.GONE : View.VISIBLE);
}
}
explose
@RequiresApi (api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onItemClick (int Position) {
Explode explode = new Explode();
explode.setDuration(1000 );
TransitionManager.beginDelayedTransition(mRlv, explode);
mMyAdapter.removeDatas();
}
Transition 与 Activity
Transition 与 Activity的跳转动画有以下几个
setEnterTransition Activity进入的动画 setExitTransition Activity退出的动画 setReturnTransition Activity返回的动画 setReenterTransition Activity重入的动画 这个Demo是一个Activity退出时的一个动画效果
public class MainActivity extends AppCompatActivity {
@RequiresApi (api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
Slide explode = new Slide(Gravity.RIGHT);
getWindow().setExitTransition(explode);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
setContentView(R.layout.activity_and_transition);
}
public void explose (View view) {
Intent intent = new Intent(this , Main2Activity.class);
if (Build.VERSION.SDK_INT >= 21 )
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this ).toBundle());
}
}
水波纹动画
ViewAnimationUtils.createCircularReveal(View view,int centerX,int centerY,float startRadius, float endRadius)
view 用来显示圆形动画的控件 centerX 圆心的坐标X轴 centerY 圆心的坐标Y轴 startRadius 动画开始圆形的半径 endRadius 动画结束时圆形的半径
public class MainActivity extends AppCompatActivity {
private FrameLayout mFl;
private RelativeLayout mActivityMain;
private int mWidth;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WindowManager wm = this .getWindowManager();
mWidth = wm.getDefaultDisplay().getWidth();
initView();
}
private void initView () {
mFl = (FrameLayout) findViewById(R.id.fl);
mActivityMain = (RelativeLayout) findViewById(R.id.activity_main);
}
@RequiresApi (api = Build.VERSION_CODES.LOLLIPOP)
public void click (View view) {
Animator anim = ViewAnimationUtils.createCircularReveal(
mFl, (int )(mWidth / 2 ), (int )(mFl.getMeasuredHeight() / 2 ),
0 , mWidth);
mFl.setBackgroundColor(Color.RED);
anim.setDuration(2000 );
anim.setInterpolator(new AccelerateDecelerateInterpolator());
anim.start();
}
}
Activity1的代码,做了一个共享动画,需要在两个共享元素的控件上(两个圆)加上transitionName属性
public class RippleActivity extends AppCompatActivity {
@RequiresApi (api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate (@Nullable Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.ripper_activity_layout);
}
public void click (View view) {
ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(this ,
findViewById(R.id.circle1), "circle" );
Intent intent = new Intent(this , CircleActivity2.class);
ActivityCompat.startActivity(this , intent, compat.toBundle());
}
}
public class CircleActivity2 extends AppCompatActivity {
@Override
protected void onCreate (@Nullable Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
ChangeBounds changeBounds = new ChangeBounds();
changeBounds.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart (Transition transition) {
}
@Override
public void onTransitionEnd (Transition transition) {
show();
}
@Override
public void onTransitionCancel (Transition transition) {
}
@Override
public void onTransitionPause (Transition transition) {
}
@Override
public void onTransitionResume (Transition transition) {
}
});
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setSharedElementEnterTransition(changeBounds);
setContentView(R.layout.circle_activit_layout2);
}
public void show (){
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
int width = toolbar.getMeasuredWidth() / 2 ;
int height = toolbar.getMeasuredHeight() / 2 ;
int max = Math.max(width, height);
Animator anim = ViewAnimationUtils.createCircularReveal(toolbar, width, height, 0 , max);
toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
anim.setDuration(1000 );
anim.start();
}
}