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