Android动画 帧动画、补间动画、属性动画 (二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tongsiw/article/details/61927737

android中动画有三种

帧动画(Frame Animation)、补间动画(Tween Animation)、属性动画(Property Animation)
上一篇 是 帧动画 、补间动画,这里就不多说了,链接地址在此:
Android动画 帧动画、补间动画、属性动画 (一)

一、属性动画(Property Animation)

属性动画我们称之为 Animator,传统动画我们称之为Animation;
传统Animation动画简单来说就是系统不断调用onDraw方法,去重绘界面,来实现动画的效,其属性值并未改变,所以传统Animation动画并不适用做交互的动画的效果,只能做一些展示的动画效果;同时传统Animation动画是通过不断调用ondraw方法,所以相对来讲比较耗资源,而且动画的特效不够丰富,只有4种,所以属性动画就诞生了。
而属性动画,是操纵一个属性的get、set方法,去真实的改变一个属性

1、ObjectAnimator xml方式

这里需要注意是的属性动画文件存放目录为res/animator

(1)、透明
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="alpha"
    android:duration="500"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:startOffset="200"
    android:valueFrom="0.0"
    android:valueTo="1.0"
    android:valueType="floatType" />
<!-- 
propertyName 属性值,这里是透明度
    平移:translation  translationX  translationY  
    旋转:rotation rotationX rotationY
    透明度:alpha
    缩放:scale  scaleX  scaleY

duration 表示动画执行的时间

valueFrom 表示从哪个状态值开始动画

valueTo 表示到哪个状态值结束动画

valueType 类型估值,主要用于设置动画操作属性的值

repeatMode 表示重复的模式 reverse表示

repeatCount 动画重复的计数,动画将会执行该值+1次

repeatMode 动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变

startOffset, 动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒 

interpolator 指定动画插入器
-->

加载代码

Animator animator= AnimatorInflater.loadAnimator(this, R.animator.alpha);
animator.setTarget(imageView);
animator.start();

大致的流程就如上,下面贴出平移、旋转、缩放的xml代码

(2)、缩放
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
   android:propertyName="scaleX"//这里可以是scale或者scaleY
  android:duration="800"
  android:repeatCount="1"
  android:repeatMode="reverse"
  android:valueFrom="1.0"
  android:valueTo="1.5"
  android:valueType="floatType" />
(3)、旋转
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="rotation"//这里可以是rotationX或者rotationY
    android:duration="800"
 android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:valueFrom="0"
    android:valueTo="360"
    android:valueType="floatType" />
(4)、平移
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    //这里可以是translationX或者translationY
    android:propertyName="translation"
    android:duration="800"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:valueFrom="0"
    android:valueTo="100"
    android:valueType="floatType" />

2、ObjectAnimator Java代码方式

(1)、透明
ObjectAnimator alphaAnimatior = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1f);
alphaAnimatior.setDuration(800);
alphaAnimatior.setRepeatCount(0);
alphaAnimatior.setRepeatMode(ValueAnimator.REVERSE);
alphaAnimatior.setStartDelay(200);
alphaAnimatior.setInterpolator(new AccelerateDecelerateInterpolator());
alphaAnimatior.start();
(2)、缩放
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 2.5f);
scaleXAnimator.setDuration(800);
scaleXAnimator.setRepeatCount(1);
scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
scaleXAnimator.start();
(3)、旋转
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "rotationY", 0f, 360f);
objectAnimator.setDuration(800);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.start();
(4)、平移

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, “translationY”, 0f, 100f);
objectAnimator.setDuration(800);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.start();

(5)、AnimatorSet组合动画
ObjectAnimator anim1 =  ObjectAnimator.ofFloat(imageView,"scaleX",1.0f,3.0f);

ObjectAnimator anim2 = ObjectAnimator.ofFloat(imageView, "scaleY",1.0f, 3.0f);  

ObjectAnimator anim3 = ObjectAnimator.ofFloat(imageView,  
                "translationX",0f ,300f);  

AnimatorSet animSet = new AnimatorSet(); 
animSet.setDuration(1000);  
animSet.setInterpolator(new LinearInterpolator());  
//三个动画同时执行  
animSet.playTogether(anim1, anim2,anim3);  
animSet.start();   
/**
 * 如果是anm1、anim2同时执行,anim3之后执行呢
 * animSet.play(anim1).with(anim2);
 * animSet.play(anim3).after(anim2);
 * animSet.start();
 */

猜你喜欢

转载自blog.csdn.net/tongsiw/article/details/61927737