nineoldandroids的使用

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方法,然后能够一一对应并且能够通过刷新界面等方式产生出动画效果!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值