Android 5.0 之后动画摘要

    xiaoxiao2021-08-28  87

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

    转载请注明原文地址: https://ju.6miu.com/read-677273.html

    最新回复(0)