Android 5.0 之后动画摘要

1   Android 5.0  转场动画 21+

             首要工作:在RES文件下创建transition文件,在该文件夹下定义界面转场动画和共享元素的动画。在你的style中设置

<item name="android:windowContentTransitions">true</item>(其实我设置了false 也可以。。。)

其次各个效果:

分解(explode):从场景中心移入或移出视图。
滑动(slide):从场景边缘移入或移出视图。
淡入淡出(fade):通过调整透明度在场景中增添或移除视图。

代码CODE :

Slide slideTransition = new Slide();
        slideTransition.setSlideEdge(Gravity.LEFT);   //左边
        slideTransition.setDuration(getResources().getInteger(R.integer.anim_duration_long));  
        getWindow().setReenterTransition(slideTransition);   //进入效果
        getWindow().setExitTransition(slideTransition);      //退出效果


XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <slide
        android:duration="@integer/anim_duration_long"
        android:slideEdge="bottom" />
</transitionSet>
调用:

  Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.explode);
        getWindow().setEnterTransition(transition);



PS:   android:targetId 表示目标ID需要进行过渡转换的 view,而 android:excludeId 表示我们不需要该 ID 的 view 进行过渡转场。

这些调用方法只要在Acitity中的onCreate方法中调用就可以了! 当然这是最基本。其他explode,fade 不做

赘述。

  上面只是设定了某个ActivityA到B的动画。对于整个应用也可以设定。

    <style name="MyTheme" parent="MaterialAnimations">
        设置过度动画
        <item name="android:windowContentTransitions">true</item>
        <!--指定进出动画效果是否覆盖 -->
        <item name="android:windowAllowEnterTransitionOverlap">false</item>
        <item name="android:windowAllowReturnTransitionOverlap">false</item>
        <!--指定界面退出\进入动画效果-->
       <item name="android:windowEnterTransition">@transition/explode</item>
       <item name="android:windowExitTransition">@transition/explode</item>
       <!--指定共享元素的退出\进入动画效果-->
       <item name="android:windowSharedElementEnterTransition">@transition/explode</item>
       <item name="android:windowSharedElementExitTransition">@transition/explode</item>
   </style>

    

元素共享

Intent intent = new Intent(ShareElementsActivity.this, ShareElementsBigActivity.class);
                startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(ShareElementsActivity.this, findViewById(R.id.sample_icon), "shareName").toBundle());


  shareName  为共享元素名称。


原对象

<ImageView
    android:id="@+id/sample_icon"
    style="@style/MaterialAnimations.Icon.Small"
    android:src="@drawable/circle_24dp"
    android:transitionName="shareName"
    android:layout_gravity="center"
    />


目标对象

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:layout_scrollFlags="scroll|enterAlways"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    android:transitionName="shareName"
    >

多个共享元素

 ActivityOptions.makeSceneTransitionAnimation(ShareElementsActivity.this,
                        Pair.create(view1,"aragemnt1"),
                        Pair.create(view1,"aragemnt1")
                );




--------------------------------------------------------------------------分隔线-----------------------------------------------------------------------------------------------

各个子元素顺序执行动画效果

    private void animateButtonsIn() {
        for (int i = 0; i < bgViewGroup.getChildCount(); i++) {
            View child = bgViewGroup.getChildAt(i);
            child.animate()
                    .setStartDelay(100 + i * DELAY)
                    .setInterpolator(interpolator)
                    .alpha(1)
                    .scaleX(1)
                    .scaleY(1);
        }
    }

<RelativeLayout
    android:id="@+id/reveal_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">


    <ImageView
        android:id="@+id/square_green"
        style="@style/MaterialAnimations.Icon.Medium.Scaled"
        android:layout_alignParentBottom="true"
        android:src="@drawable/circle_24dp"
        android:tint="@color/sample_green" />

    <ImageView
        android:id="@+id/square_red"
        android:layout_toRightOf="@id/square_green"
        style="@style/MaterialAnimations.Icon.Medium.Scaled"
        android:layout_alignParentBottom="true"
        android:src="@drawable/circle_24dp"
        android:tint="@color/sample_red" />

    <ImageView
        android:id="@+id/square_blue"
        android:layout_toRightOf="@id/square_red"
        style="@style/MaterialAnimations.Icon.Medium.Scaled"
        android:layout_alignParentBottom="true"
        android:src="@drawable/circle_24dp"
        android:tint="@color/sample_blue" />

    <ImageView
        android:id="@+id/square_yellow"
        android:layout_toRightOf="@id/square_blue"
        style="@style/MaterialAnimations.Icon.Medium.Scaled"
        android:layout_alignParentBottom="true"
        android:src="@drawable/circle_24dp"
        android:tint="@color/sample_yellow" />
</RelativeLayout>

关于Interpolator

 AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速

  AccelerateInterpolator  在动画开始的地方速率改变比较慢,然后开始加速

  AnticipateInterpolator 开始的时候向后然后向前甩

  AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值

  BounceInterpolator   动画结束的时候弹起

  CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

  DecelerateInterpolator 在动画开始的地方快然后慢

  LinearInterpolator   以常量速率改变

  OvershootInterpolator    向前甩一定值后再回到原来位置

波纹效果

    private Animator animateRevealColorFromCoordinates(ViewGroup viewRoot, @ColorRes int color, int x, int y) {
        float finalRadius = (float) Math.hypot(viewRoot.getWidth(), viewRoot.getHeight());

        Animator anim = ViewAnimationUtils.createCircularReveal(viewRoot, x, y, 0, finalRadius);
        viewRoot.setBackgroundColor(ContextCompat.getColor(this, color));
        anim.setDuration(getResources().getInteger(R.integer.anim_duration_long));
        anim.setInterpolator(new AccelerateDecelerateInterpolator());
        anim.start();
        return anim;
    }


猜你喜欢

转载自blog.csdn.net/yan822/article/details/53212692