Android动画
补间动画
Tween (补间)动画可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。 譬如,如果你有一个 TextView 对象,您可以让这个TextView移动、旋转、缩放、透明度,当然,如果它有一个背景图像,背景图像会随着文本变化。
补间动画通过 XML 或 Android 代码定义,建议使用 XML 文件定义,因为它更具可读性、可重用性。
补间动画相关:
类名 | xml关键字 | 描述信息 |
---|---|---|
AlphaAnimation | <alpha> | 渐变透明度 |
RotateAnimation | <rotate> | 旋转 |
ScaleAnimation | <scale> | 渐变缩放 |
TranslateAnimation | <translate> | 平移 |
AnimationSet | <set> | 动画集合 |
动画属性
xml 属性 | 描述 |
---|---|
android:detachWallpaper | 是否在壁纸上运行 |
android:duration | 动画持续时间,毫秒为单位 |
android:fillAfter | 控件动画结束时是否保持动画最后的状态 |
android:fillBefore | 控件动画结束时是否还原到开始动画前的状态 |
android:fillEnabled | 与android:fillBefore效果相同 |
android:interpolator | 设定插值器(指定的动画效果,譬如回弹等) |
android:repeatCount | 重复次数 |
android:repeatMode | 重复类型:reverse表示倒序回放,restart表示从头播放 |
android:startOffset | 调用start函数之后等待开始运行的时间,单位为毫秒 |
android:zAdjustment | 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal |
Alpha属性
xml属性 | 描述 |
---|---|
android:fromAlpha | 动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) |
android:toAlpha | 动画结束时的透明度 |
Rotate 属性
xml 属性 | 描述 |
---|---|
android:fromDegrees | 旋转开始角度,正代表顺时针度数,负代表逆时针度数 |
android:toDegrees | 旋转结束角度,其它同上 |
android:pivotX | 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点) |
android:pivotY | 缩放起点Y坐标,其它同上 |
Scale 属性
xml 属性 | 描述 |
---|---|
android:fromXScale | 初始化X轴缩放比例,1.0表示无变化 |
android:toXScale | 结束X轴缩放比例 1.0-0.0 |
android:fromYScale | 初始化Y轴缩放比例 |
android:toYScale | 结束Y轴缩放比例 |
android:pivotX | 缩放起点X轴坐标,同旋转 |
android:pivotY | 缩放起点Y轴坐标,同上 |
Translate 属性
xml 属性 | 描述 |
---|---|
android:fromXDelta | 起始点X轴坐标,同旋转 |
android:fromYDelta | 起始点Y轴坐标 ,同上 |
android:toXDelta | 结束点X轴坐标 ,同上 |
android:toYDelta | 结束点Y轴坐标 ,同上 |
相关代码 == 动画集合形式
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
<scale
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
//使用
ImageView Image = (ImageView) findViewById(R.id.ipImage);
Animation JumpAnimation = AnimationUtils.loadAnimation(this, R.anim.space_jump);
Image.startAnimation(JumpAnimation);
视图动画插值器 Interpolator
使用:
<alpha android:interpolator="@android:anim/accelerate_interpolator">
...
</alpha >
系统自带的插值器:
自定义插值器:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
android:attribute_name="value"
/>
关于插值器的属性:
<accelerateInterpolator>
android:factor 浮点数,加速速率 默认为1
<anticipateInterploator>
android:tension 浮点数,起始点后拉的张力数(默认值为2)
<cycleInterplolator>
android:cycles 整形,循环的个数(默认为1)。
<decelerateInterpolator>
android:factor 浮点数,减速的速率(默认为1)。
<overshootInterpolator>
android:tension 浮点值,超出终点后的张力(默认为2)。
//一个动画始末速率较慢、中间加速的 AccelerateDecelerateInterpolator 插值器
public class AccelerateDecelerateInterpolator extends BaseInterpolator
implements NativeInterpolatorFactory {
......
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}
......
}
Ripple Effect / Touch Feedback / 触摸反馈动画
材料设计中的触摸反馈在用户和UI元素交互的点提供瞬时视觉确认。例如,当按钮被触摸时显示一个水波纹效果。 这是 Android 5.0 默认的触摸反馈动画。水波纹动画通过新的 RippleDrawable 类实现。水波纹效果可以配置在 View 边界的末端或超出 View 的边界。
//有边界
?android:attr/selectableItemBackground
//无边界 (要求API21以上)
?android:attr/selectableItemBackgroundBorderless
使用时只需要把上面这两个值作为 View 的 android:background="" 或 android:foreground="" 即可(如果已经有背景, 可以设置到前景属性中)。同时如果想要效果显示出来要保证 View 是可点击的(比如控件本身可点击、或者给控件设置点击事件、 或给控件设置 android:clickable=“true”)。
自定义 Ripple
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#4285f4">
<!--ripple中color:波纹点击颜色-->
<!--ripple中radius:波纹大小,则触摸显示的波纹为设置的固定大小,
不会为手指触摸点开始显示-->
<!--添加边界 存在边界就是矩形,无边界就是圆形-->
<item android:drawable="@color/colorAccent"/>
</ripple>
自定义Ripple和shape结合,控制水波纹扩散的图形
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ff9d77"/>
<corners
android:bottomRightRadius="100dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FF0000" >
<item
android:id="@android:id/mask"
android:drawable="@drawable/shape"/>
</ripple>
自定义Ripple和selector结合,水波纹和按钮转态切换
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FF0000" >
<item>
<selector>
<item
android:drawable="@drawable/icon_bg1"
android:state_pressed="true">
</item>
<item
android:drawable="@drawable/icon_bg2"
android:state_pressed="false">
</item>
</selector>
</item>
</ripple>
Activity转场动画-overridePendingTransition(0, 0)
overridePendingTransition(0, 0);用来指定Activity之间的切换动画
Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。
它包括两个部分
:
一部分是第一个参数是activity退出时的动画;
另外一部分时第二个参数是activity进入时的动画;
在Android的2.0版本之后,有了一个函数来帮我们实现这个动画。这个函数就是
overridePendingTransition
这个函数有两个参数,一个参数是MainActivity2.class
进入时的动画,另外一个参数则是ShowUiActivity.this
退出时的动画。
这里需要特别说明的是,关于overridePendingTransition这个函数,有两点需要主意
1.它必需紧挨着startActivity()或者finish()函数之后调用”
2.它只在android2.0以及以上版本上适用
API 21之前Activity过渡动画使用:
style文件主题里面统一定义,全局为所有Activity设置过渡动画效果。
<item name="android:windowAnimationStyle">@style/Animation.Activity.Customer</item>
<style name="Animation.Activity.Customer" parent="@android:style/Animation.Activity">
<!-- 进入一个新的Activity的时候,A->B B进入动画 -->
<item name="android:activityOpenEnterAnimation">@anim/right_in</item>
<!-- 进入一个新的Activity的时候,A->B A退出动画 -->
<item name="android:activityOpenExitAnimation">@anim/left_out</item>
<!-- 退出一个Activity的时候,B返回到A A进入动画 -->
<item name="android:activityCloseEnterAnimation">@anim/left_in</item>
<!-- 退出一个Activity的时候,B返回到A B退出动画 -->
<item name="android:activityCloseExitAnimation">@anim/right_out</item>
</style>
Intent intent = new Intent(ShowUiActivity.this,MainActivity2.class);
startActivity(intent);
overridePendingTransition(R.anim.cat_in,R.anim.cat_out);
//overridePendingTransition(0, 0);
API 21(5.0)后系统内置了Activity之间的切换动画,满足我们日常开发的需求,但是意味着这些动画只适用于5.0之后的系统(兼容);
关于内置Activity之间切换动画如何使用
Activity之间的切换动画,对于任意一个Activity来说,无非就是“进入”和“退出”两种情景下的动画。而“进入”分为“第一次进入Activity”和“返回当前Activity”这两种情况。另外系统还提供了一种动画,即共享元素,这是让两个Activity中的View有个过渡切换的效果。执行动画的状态如下所示:
Transitionz过渡动画的使用也是有前提的: API
21以上。当然你也可以不使用ActivityOptions,而是使用兼容类ActivityOptionsCompat来替换ActivityOptions。(兼容类给到我们的作用是保证程序在低版本运行不会挂掉,但是不能保证低版本也能起到响应的效果的)
必须允许Activity可以使用Transition,要么在style里面设置(true),要么直接通过代码设置(getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)😉。
enter
:用于决定第一次打开当前Activity时的动画
exit
: 用于决定退出当前Activity时的动画
reenter
: 用于决定如果当前Activity已经打开过,并且再次打开该Activity时的动画
shared elements
:用于决定在两个Activity之间切换时,指定两个Activity中对应的View的过渡效果
三种动画效果:transition:Explode(爆炸分解),Slide(滑动),Fade(淡入淡出).
而你需要做的,首先对Activity的ThemeStyle添加windowContentTransitions属性:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
...
<!-- 允许使用transitions -->
<item name="android:windowContentTransitions">true</item>
<!--是否覆盖执行,其实可以理解成是否同步执行还是顺序执行-->
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowAllowReturnTransitionOverlap">false</item>
</style>
//退出时使用
getWindow().setExitTransition(explode);
//第一次进入时使用
getWindow().setEnterTransition(explode);
//再次进入时使用
getWindow().setReenterTransition(explode);
**我们有两种方式来定义过渡动画:资源文件的方式、代码的方式。
**
该xml定义了一个slide过渡动画,除了状态栏、导航栏以外其他所有的View进行滑入滑出动画效果。 android:slideEdge=”top” 设置滑动的方向
<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000">
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
</targets>
</slide>
元素共享动画 和场景动画
参考链接:
- https://blog.csdn.net/wuyuxing24/article/details/78857912
- https://github.com/Trisaa/MaterialTranstion
- https://github.com/OCNYang/Android-Animation-Set/blob/master/view-animation/ViewAnimationUseTips.md
- OCNYang 动画合集讲解
- 小欣儿