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