安卓动画之属性动画

一 属性动画概述:
     属性动画是API11新加入的特性,和view动画不同,它可以对任何对象进行操作,甚至还可以没有对象,属性动画的默认间隔时间300ms,默认帧率10ms/帧,它的原理就是:在一段时间内完成一个对象一个属性值到另一个属性值的改变。
     属性动画从API11以后才有,如果要兼容以前的版本,可以采用nineoldandroids,但是本质还是view动画
二 属性动画之ObjectAnimator
    ObjectAnimator是属性动画框架中最重要的实行类,创建一个ObjectAnimator只需通过他们的静态工厂直接返回一个Object对象,参数包括一个对象和对象的属性,但这个属性必须有get和set函数,内部通过java反射机制来调用set函数修改对象属性值,属性动画可以定义代码中和xml中
     代码中:
          效果1:以x轴为基准线翻转360

ObjectAnimator.ofFloat(iv_share,"rotationX",0.0f,360.0f).setDuration(500).start();


     效果2:以y轴为基准线翻转360

ObjectAnimator.ofFloat(iv_share,"rotationY",0.0f,360.0f).setDuration(500).start();

          
效果3:以z轴为基准线翻转360

ObjectAnimator.ofFloat(iv_share,"rotation",0.0f,360.0f).setDuration(500).start(); 

           效果4:上下方向移动
 

ObjectAnimator.ofFloat(iv_share,"TranslationY",-200).setDuration(2000).start();

         

效果5:左右方向移动

ObjectAnimator.ofFloat(iv_share, "TranslationX",-200).setDuration(2000).start();
      效果6:x轴方向缩放dao

ObjectAnimator.ofFloat(iv_share,"scaleX",0.0f,3.0f).setDuration(500).start();

      效果7:y轴方向缩放

ObjectAnimator.ofFloat(iv_share,"scaleY",0.0f,3.0f).setDuration(500).start();
      效果8:透明度变化 从0到1
ObjectAnimator.ofFloat(iv_share,"alpha",0,1).setDuration(2300).start();
      xml中使用:属性动画需定义在res/animator/目录下
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType"
>
</objectAnimator>
Animator anima  = AnimatorInflater.loadAnimator(MainActivity.this,R.animator.object_animator);
anima.setTarget(iv_share);
anima.start();
三:属性动画之AnimatorSet
    动画集合,不仅可以对同一个对象作用多个属性动画效果,还可以实现顺序控制, 实现方式有代码和xml两种方式

    代码形式:

 ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv_share,"translationX",300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv_share,"scaleX",1f,0f,1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv_share,"scaleY",1f,0f,1f);
AnimatorSet set = new AnimatorSet();
set.setDuration(3000);
//一起执行
// set.playTogether(animator1,animator2,animator3);
//依次执行
set.playSequentially(animator1,animator2,animator3);
//先执行2后执行1
// set.play(animator1).after(animator2);
//1,2一块执行
// set.play(animator1).with(animator2);
set.start();
     xml形式:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together"
>
<objectAnimator
android:propertyName="scaleX"
android:duration="1000"
android:valueFrom="0.0f"
android:valueTo="1.0f"
android:repeatCount="1"
android:valueType="floatType"
/>
<objectAnimator
android:duration="1000"
android:propertyName="rotation"
android:interpolator="@android:interpolator/linear"
android:valueFrom="0"
android:valueTo="359"
android:valueType="floatType"
android:repeatCount="-1"
/>
</set>
AnimatorSet set = (AnimatorSet) AnimatorInflater.loa,但是dAnimator(MainActivity.this,R.animator.animatorset_animator);
set.setTarget(iv_share);
set.start();
四:属性动画之PropertyValuesHolder

在属性动画中,如果针对同一对象的多个属性,要同时左右多种动画,可以使用PropertyValuesHolder来实现,这个与上面的区别是不能实现顺序控制

PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("translationX",300f);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("scaleX",1f,0,1f);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("scaleY",1f,0,1f);
ObjectAnimator.ofPropertyValuesHolder(iv_share,p1,p2,p3).setDuration(1000).start();
五:属性动画之ValueAnimator

1.ValueAnimator本身不提供任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程,一般情况下,在ValueAnimator的AnimatorUpdateListener中监听数字的变换,从而进行动画的操作

ValueAnimator animator = ValueAnimator.ofFloat(1,100);
animator.setTarget(iv_share);
animator.setRepeatCount(-1);
animator.setDuration(1000).start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value = (Float) animation.getAnimatedValue();
iv_share.setTranslationX(value);
}
});
2.可以用动画来做一个背景色颜色的渐变

//改变背景颜色变换,颜色值可以输入多个进行切换,时间平分
ValueAnimator colorAnim = ObjectAnimator.ofInt(listView,"backgroundColor",0x22222222,0xFF8080FF,0x00001111,0x78787878);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.RESTART);
colorAnim.start();
六:属性动画之动画的监听

   
 ObjectAnimator object = ObjectAnimator.ofFloat(iv_share, "rotationY", 0.0f, 360.0f);
object.setDuration(2000);
object.start();
//第一种,可以自己选择覆写哪个方法
object.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Toast.makeText(MainActivity.this, "停止执行属性动画1", Toast.LENGTH_SHORT).show();
}
});
//第二种,全部重写
object.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
//动画开始执行时
Toast.makeText(MainActivity.this, "开始执行属性动画", Toast.LENGTH_SHORT).show();
}

@Override
public void onAnimationEnd(Animator animation) {
//动画结束执行时
Toast.makeText(MainActivity.this, "停止执行属性动画", Toast.LENGTH_SHORT).show();
}

@Override
public void onAnimationCancel(Animator animation) {
//放弃执行
Toast.makeText(MainActivity.this, "放弃执行属性动画", Toast.LENGTH_SHORT).show();
}

@Override
public void onAnimationRepeat(Animator animation) {
//动画重复执行
Toast.makeText(MainActivity.this, "重复执行属性动画", Toast.LENGTH_SHORT).show();
}
});

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值