nineoldandroids的使用
在学习nineoldandroids的使用之前,我们先来了解Android其他几种实现动画效果的方式:
- 逐帧动画: 类似放幻灯片,不断循环切换(播放)图片资源实现视觉上的动画效果
- 补间动画:对view进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种
逐帧动画
1.定义好动画文件:(oneshot:只有一次?)
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false" >
<item
android:drawable="@drawable/main_plant_1"
android:duration="100"/>
<item
android:drawable="@drawable/main_plant_2"
android:duration="100"/>
</animation-list>
2.setImageRescource传入动画资源,再可通过(AnimationDrawable)~.getBackground()或是… .getDrawable()方法得到AnimationDrawable对象,调用start()即可开始动画了。
补间动画
补间动画顾名思义就是在确定 两个帧间填补所需的过度帧,所以只需要确定开始帧与结束帧的状态就OK了。补间动画有四种:放大缩小、位移、旋转、渐变。也就是——
AlphaAnimation
:透明度(alpha)渐变效果,对应<alpha/>
标签。
TranslateAnimation
:位移渐变,需要指定移动点的开始和结束坐标,对应<translate/>
标签。
ScaleAnimation
:缩放渐变,可以指定缩放的参考点,对应<scale/>
标签。
RotateAnimation
:旋转渐变,可以指定旋转的参考点,对应<rotate/>
标签。
当然还有个<set/>
标签可以来组合使用这几种动画,定义好动画(其实都是这两个from,to而已),然后使用也十分简单,如下:
Animation animation = AnimationUtils.loadAnimation(this,
R.anim.translate_demo);
animation.setRepeatCount(Animation.INFINITE);//循环显示
imageView.startAnimation(animation);
但是,要实现比较复杂一些的动画,比如我们要一个可以自动展开的扇形动画,显然依靠这两种动画方式是不够的。幸运的是Android自从3.0开始引入了一种全新的动画模式,这也就是属性动画了。属性动画也是如此,顾名思义也就是动态改变其属性(这里不仅仅只对view),实现动画,这个动态改变的过程类似补间动画,当然我们也一加入一些插值器影响这个动态设置的过程,实现更加绚丽的效果。
接下来真正进入到主题,nineoldandroids是一个兼容3.0以前的开源的动画框架,在3.0以前我们也能以此来使用属性动画来实现复杂的动画效果。
ValueAnimatior
属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。
ofInt()
ofFloat()
ofObject()
ObjectAnimatior
ObjectAnimator.ofFloat(view, 属性(具备getter&setter,并能具备变化的动作,比如刷新界面的动作),起始值,终点值)
AnimatorSet
-
组合动画
- before(Animator anim)
- after(Animator anim)
- after(long delay)
- with(Animator anim)
- play()
XML编写动画
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="-500"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="sequentially" >
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" >
</objectAnimator>
</set>
</set>
</set>
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
属性动画的使用最重要的是理解动态设置属性这一过程,我们可以自己定义一个属性然后通过setter,getter方法实现这一动态过程,这在一些自定义View的创建中可以实现你所需要的动画过程。
(睡觉去……)
下面是一个例子:
自定义实现一个可以动态展开的扇形ImageView:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (null == rectF)
rectF = new RectF(0 - (int)(canvas.getWidth() * 0.414), 0 - (int) (canvas.getHeight() * 0.414),
(int) (canvas.getWidth() * 1.414), (int) (canvas.getHeight() * 1.414));
paint.reset();
paint.setColor(Color.parseColor("#7f000000"));
canvas.drawArc(rectF, 0, 360 - angle, true, paint);
}
public int getAngle() {
return angle;
}
public void setAngle(int angle) {
this.angle = angle;
invalidate();
}
动画调用:
ValueAnimator angleAnim = ObjectAnimator.ofInt(view, "angle", fromAngle, toAngle);
angleAnim.setDuration(1000);
// angleAnim.setEvaluator(new ArgbEvaluator());
angleAnim.start();
通过”angle”找到getter/setter方法,实现动态设置实现动画效果。
该对象的属性必须有get和set方法(方法的格式必须是驼峰式),方法格式为set(),因为ObjectAnimator会自动更新属性,它必须能够访问到属性的setter方法,比如属性名为foo,你就需要一个setFoo()方法,如果setter方法不存在,你有三种选择:
a.添加setter方法
b.使用包装类。通过该包装类通过一个有效的setter方法获取或者改变属性值的方法,然后应用于原始对象。
c.使用ValueAnimator代替。
也就是说,要具有能让ObjectAnimator找到的setter 和 getter方法,然后能够一一对应并且能够通过刷新界面等方式产生出动画效果!