1. 帧动画
通过资源文件引入每一帧的图片和时长,然后播放达到效果。xml 分类为 animation-list,drawable 的一种。
<!-- Animation frames are wheel0.png through wheel5.png
files inside the res/drawable/ folder -->
<animation-list android:id="@+id/selected"
android:oneshot="false">
<item android:drawable="@drawable/wheel0" android:duration="50" />
<item android:drawable="@drawable/wheel1" android:duration="50" />
<item android:drawable="@drawable/wheel2" android:duration="50" />
<item android:drawable="@drawable/wheel3" android:duration="50" />
<item android:drawable="@drawable/wheel4" android:duration="50" />
<item android:drawable="@drawable/wheel5" android:duration="50" />
</animation-list>
xml 属性解析:
item 为图片资源和时长。
oneshot 是否为单次 true 只播放一次, false 循环播放
在Activity里面通过AnimationDrawable使用。
ImageView img=(ImageView)findViewById(R.id.spinning_wheel_image);
img.setBackgroundResource(R.drawable.spin_animation);
// Get the background, which has been compiled to an AnimationDrawable object.
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
// Start the animation (looped playback by default). frameAnimation.start();
例子是以imageview的background为载体,也可以直接写在imageview 的source中,获取并操作:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/spin_animation"
android:id="@+id/spinning_wheel_image"/>
ImageView img=(ImageView)findViewById(R.id.spinning_wheel_image);
AnimationDrawable frameAnimation = (AnimationDrawable) img.getDrawable();
frameAnimation.start();
2. AnimationObject
属性动画,谷歌在新版api中添加的动画类型。其本质是通过插值器改变对应的view 的相关属性,而达到动画的目的。其主要的使用类有以下两种:
ValueAnimator
接口暴露最完备的一个类。可以完整地通过变化中的插值来改变动画的状态。如:
public static ValueAnimator getAnim (final View target, final int start, final int end, final int duration){
final int steps =duration /10;
ValueAnimator vA = ValueAnimator.ofInt(1,steps);
vA.addUpdateListener(new ValueAnimator.AnimationUpdateListener(){
private IntEvaluator mEvaluator = IntEvaluator();
@Override
public void onAnimationUpdate(Valuanimator animator){
int currentValue = (Integer) animator.getAnimationValue();
float fraction = currentValue / ((float)steps);
target.getLayoutParams().height =mEvaluator.evaluate(fraction, start, end);
target.requestLayout();
}
});
vA.setDuration(duration);
return vA;
}
ObjectAnimator
最常见的调用方法如下
ObjectAnimator animator = ObjectAnimator.ofFloat(EditDraftView.this, "translationX", 0, -ScreenTools.instance().dip2px(180f));
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(700);animator.start();
其实也是封装了一个插值器。因此,在传入的第二个参数意味着,改target 必须有 getXXX这样的方法,setXXX方便系统调用并设置。方法的好处在于简单易用。对于没有对应的XXX的方法的类,可以设置一个包裹类,提供对应方法。
TranslateAnimation
继承自系统的Animation。与之类似的子类还有
AlphaAnimation, AnimationSet, RotateAnimation, ScaleAnimation, TranslateAnimation
特点是使用简易,然而自定义程度较低。直接通过View 设置
范例
public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
Added in [API level 1]
Constructor to use when building a TranslateAnimation from code
Parameters
fromXDelta
Change in X coordinate to apply at the start of the animation
toXDelta
Change in X coordinate to apply at the end of the animation
fromYDelta
Change in Y coordinate to apply at the start of the animation
toYDelta
Change in Y coordinate to apply at the end of the animation
translateAnimation.setDuration(3000); //设置动画持续时间
translateAnimation.setRepeatCount(2); //设置重复次数
translateAnimation.setRepeatMode(Animation.REVERSE); //反方向执行
image.setAnimation(translateAnimation); //设置动画效果
translateAnimation.startNow();
再补充一种Animation的使用方式
首先定义XML
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:fillBefore="false">
<alpha
android:duration="1500"
android:fromAlpha="1"
android:repeatCount="5"
android:repeatMode="restart"
android:toAlpha="0.01" />
<scale
android:duration="1500"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="5"
android:repeatMode="restart"
android:toXScale="2.2"
android:toYScale="2.2" />
</set>
其中描述的是对应动画的变化方式,这种xml 的定义方式具备一定的局限性,无法完成复杂的动画模式,原理跟上一种一样
然后使用
Animation animation =
AnimationUtils.loadAnimation(getContext(),
R.anim.u_biz_anim_publish_breathing);
ImageView mPublishCamAnim = xxx;
mPublishCamAnim.startAnimation(animation);
这里注意,直接使用animation.start的方法是不可靠的,因为view 对象需要对动画进行validate。所以需要用view 对象的start animation