android 动画基础
分类 :
帧动画 (图片动画)
视图动画
属性动画
帧动画 :
有多个图片组成
方法 :
· AnimationDrawable
· <animation-list>
文件中放入预先做好的动画帧,在drawable 文件夹右键 new xml文件,根标签为
<animation-list>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 将要显示效果的动画帧图片 和每一帧显示时间-->
<item
android:drawable="@drawable/ic_launcher_background"
android:duration="100" />
<item
android:drawable="@drawable/ic_launcher_foreground"
android:duration="100" />
<item
android:drawable="@drawable/ic_launcher_background"
android:duration="100" />
</animation-list>
在view 的background :属性中引用生成的 animation-list 文件,在Activity中
// view.getBackground() 获取到 用来控制帧动画的类
animationDrawable = (AnimationDrawable) view.getBackground();
animationDrawable.start();
animationDrawable.stop();
视图动画 :
操作的是Android的视图 ,比如 button ,textview显示一些效果,展示补间动画,起点、终点和时间 。 视图动画并不改变视图的属性。
Animation 是一个抽象类,用来操作视图动画
res 目录下新建 anim 目录
透明度:
<alpha> 对应AlphaAnimation类
anim 目录下新建 xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.1" />
</set>
在Activity 中
Animation alphaAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
view.startAnimation(alphaAnimation); // start 不是 set ,
缩放 :
<scale> 对应 ScaleAnimation
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fillAfter="true">
<!-- fillAfter = true 表示拉伸后保持状态不变 -->
<!-- pivotX = 50 基准点 具体数值 距离左边50个像素的位置 -->
<!-- pivotX = 50% 距离左边50%的位置 -->
<!-- pivotX = 50%p 距离父容器左边50% 的位置 -->
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="2.0"
android:toYScale="2.0" />
</set>
Activity 中
Animation scaleAnimation = AnimationUtils.loaddAnimation(this,R.anim.scale);
view.startAnimation(scaleAnimation);
位移动画: 视图的位置发生移动
<translate> 对应 TranslateAnimation
<!-- android:toXDelta="100%" 相对自身 位移一个宽度 -->
<!-- android:toXDelta="20%p" 相对位移到使左边距 到 父布局的20%的位置 -->
<!-- android:toXDelta="30" 向右位移30个像素 -->
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100%"
android:toYDelta="0" />
旋转动画 :
<rotate> 对应 RotateAnimation
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- android:fromDegrees="0" 起始角度 -->
<!-- android:pivotX="0" 基准点 -->
<!-- android:pivotY="0" -->
<!-- android:toDegrees="90" 目标角度-->
<!-- android:repeatCount="3" 重复次数-->
<!-- Android:repeatMode="restart"|"reverse" 从头开始 | 原路返回-->
<rotate
android:duration="1000"
android:fromDegrees="0"
android:pivotX="0"
android:pivotY="0"
android:repeatCount="3"
android:toDegrees="90" />
</set>
集合动画 :
<set> 对应 AnimationSet 展示复合动画
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- startOffset = "1000" 表示延迟1000ms 之后开始 -->
<rotate android:toDegrees=""
...
/>
<translate android:toYDelta=""
android:startOffset = "1000"
...
/>
</set>
在Activity 中使用方法时一样的。
差值器 : Interpolator
Activity 中
Animation a = AnimationUtils.loadAnimation(this,R.anim.translate);
a.setInterpolator(new LinearInterpolator); //线性变化率
AccelerateInterpolator() ; // 加速差值器
view.setAnimation(a);
属性动画
操作任意对象,(视图动画只可以操作视图对象,改变不了属性),真实的修改视图属性
动画属性 : 时长, 时间差值器,重复次数以及重复模式,动画集,延迟
类 :
Animator
ValueAnimator
AnimatorSet
ValueAnimator的使用:
/**
* 动画 简单的说 就是 起点, 终点 和时间
*/
ValueAnimator va = ValueAnimator.ofFloat(0f, 1.0f);
va.setDuration(1000);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedFraction = animation.getAnimatedFraction(); // 完成度
float value = (float) animation.getAnimatedValue(); // 当前生成的差值
// 循环执行的,默认非线性的,如果需要线性执行,
va.setInterpolator(new LinearInterpolator());
}
});
va.start();
AnimatorSet 的使用 :
ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(view, "rotation", 0, 720f);
rotateAnimator.setDuration(1000);
ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(view, "x", 0, 100f);
translateAnimator.setDuration(1000);
AnimatorSet set = new AnimatorSet();
set.playSequentially(rotateAnimator, translateAnimator); // 按照先后顺序执行
// set.playTogether(rotateAnimator, translateAnimator); // 同时进行
set.start();
上述效果的另外一种方法 :
view.animate().rotation(720).setDuration(1000).start();
//setStartDelay(1000) 延迟 1000ms 进行
view.animate().translationX(500).setDuration(1000).setStartDelay(1000).start();
ViewPropertyAnimator 让视图产生动画的类
ViewPropertyAnimator va = view.animate();
va.translationX(500);
va.start();