Android动画
2019-10-18 本文已影响0人
云木杉
简介
View的动画大体上划分为三种,补间动画(View动画)、帧动画以及属性动画,其中属性动画是5.0(api 11)以后才有的
- View动画作用于View,是对当前view的一系列操作(平移,旋转,缩放,透明),可以混合操作。四种动画操作可以通过xml制定,也可以通过代码来编写。
- 帧动画是按照一定顺序播放既有的一系列图片的过程。
- 属性动画,作用于对象
View动画(Tween动画 补间动画)
优缺点,优点肯定是使用起来,操作简单,效果也比较流畅,但缺点也很明显,可拓展性太差,只能写移动、缩放、旋转、渐变四种动画,以及这四种动画的组合。还有一个缺点是动画只是绘制到了屏幕上,View的属性并没有发生变化,最典型的就是一个Button从一个位置移动到另一个地方,但点击事件还在原地。
- TranslateAnimation
位移动画 - ScaleAnimation
缩放动画 - RotateAnimation
旋转动画 - AlphaAnimation
透明动画(淡入淡出)
// pivot决定了当前动画执行的参考位置,相当于动画开始的起点,以百分比为数值,主要是在translate 和 scale 动画中
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
// Interpolator主要作用是可以控制动画的变化速率,就是动画进行的快慢节奏。
android:interpolator="@[package:]anim/interpolator_resource"
android:fillAfter="true">
<translate
android:duration="100"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100"
android:toYDelta="100" />
<scale
android:duration="3000"
android:fromYScale="0"
android:fromXScale="0"
android:pivotX="0%"
android:pivotY="50%"
android:toYScale="1.0"
android:toXScale="1.0"/>
<rotate
android:duration="1000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="1"
android:repeatMode="reverse"
android:toDegrees="359" />
</set>
// 代码示例
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
img = (ImageView) findViewById(R.id.img);
img.startAnimation(animation);
帧动画
原理就有点像播放幻灯片时,传一组图片进去,然后依次播放。可以通过xml创建,也可以Java代码动态构建。缺点就是动画不连续,解决办法呢就是把图片做的多一些,但体积又会变大,很尴尬的问题。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@mipmap/run_1" android:duration="150" />
<item android:drawable="@mipmap/run_2" android:duration="150" />
<item android:drawable="@mipmap/run_3" android:duration="150" />
<item android:drawable="@mipmap/run_4" android:duration="150" />
</animation-list>
ImageView image = (ImageView) findViewById(R.id.iv_1);
image.setImageResource(R.drawable.animation_list);
AnimationDrawable anim = (AnimationDrawable) image.getDrawable();
anim.start();
属性动画
- ValueAnimator
ValueAnimator的功能就是在两个数值范围内,顺序地产生过渡数值,过渡速率可以通过intepolator来控制,过渡时间通过duration来控制,最终产生数值序列。
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。
工作原理
舒心动画要求动画作用的对象提供该属性的set方法,属性动画根据你传递的该属性的初始值和最终值,以动画的效果多次去调用set方法。每次传递给set方法的值都不一样,确切来说随着时间的推移,所传递的值越来越接近最终值。如果动画的时候没有传递初始值,那么还要提供get方法,因为系统要去获取属性的初始值。
插值器和估值器
- Interpolator中文翻译为插值器。作用于更具流逝的百分比算出当前属性值改变的百分比。
- TypeEvaluator 类型估值。作用于根据当前属性改变的百分比来计算改变后的属性值。
ValueAnimator animator = ValueAnimator.ofFloat(0, 90);
animator.setDuration(3000);
animator.setInterpolator(new AccelerateInterpolator());
animator.setRepeatCount(1);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float value = (float) valueAnimator.getAnimatedValue();
image.setRotationY(value);
}
});
animator.start();
// ObjectAnimator 更简洁
ObjectAnimator animator = ObjectAnimator.ofFloat(image, "rotationY", 0, 359);
animator.setDuration(1000);
animator.setRepeatCount(1);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.start();
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.5f, 0.8f, 1.0f);
ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f);
ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 0.0f, 2.0f);
ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(myView, "rotation", 0, 360);
ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400);
ObjectAnimator transYAnim = ObjectAnimator.ofFloat(myView, "tranlsationY", 100, 750);
AnimatorSet set = new AnimatorSet();
set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
// set.playSequentially(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
set.setDuration(3000);
set.start();
// ValueAnimator采用<animator> 标签
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0" // 初始值
android:valueTo="100" // 结束值
android:valueType="intType" // 变化值类型 :floatType & intType
android:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果
android:startOffset ="1000" // 动画延迟开始时间(ms)
android:fillBefore = “true” // 动画播放完后,视图是否会停留在动画开始的状态,默认为true
android:fillAfter = “false” // 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
android:fillEnabled= “true” // 是否应用fillBefore值,对fillAfter值无影响,默认为true
android:repeatMode= “restart” // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart|
android:repeatCount = “0” // 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复
android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影响动画的播放速度,下面会详细讲
/>
矢量动画(纯粹的做个笔记)
- vector:显示一个矢量图形,用SVG的语法构建Path
- animated-vector:组合两个vector,让vector动起来
- animated-selector:组合两个animated-vector,实现双向切换动画