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();
}
}