android -- 基础篇 -- view 动画(上)

一、简介:

Android 系统一开始给我们提供两种实现动画效果(逐帧动画(frame-by-frame animation)和补间动画(tweened animation))。逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。

然而自Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。

二、Android动画类型:

Android的animation由四种类型组成:

XML:

alph 渐变透明度动画效果

scale 渐变尺寸伸缩动画效果

translate 画面转换位置移动动画效果

rotate 画面转移旋转动画效果

 

JavaCode:

AlphaAnimation 渐变透明度动画效果

ScaleAnimation 渐变尺寸伸缩动画效果

TranslateAnimation 画面转换位置移动动画效果

RotateAnimation 画面转移旋转动画效果

三、.Android动画模式
Animation主要有两种动画模式:
一种是tweened animation(渐变动画)
     XML中          JavaCode
    alpha             AlphaAnimation
    scale            ScaleAnimation


一种是frame by frame(画面转换动画) 
  XML中             JavaCode
translate       TranslateAnimation
rotate       RotateAnimation

四、XML文件中定义动画

1、在res目录中新建anim文件夹

2、在anim目录中新建一个anim.xml

4.1、alpha 渐变透明度动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <alpha
        android:duration="3000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
    <!--
     透明度控制动画效果 alpha
        浮点型值:
            fromAlpha 属性为动画起始时透明度
            toAlpha   属性为动画结束时透明度
            说明: 
                0.0表示完全透明
                1.0表示完全不透明
            以上值取0.0-1.0之间的float数据类型的数字
        
        长整型值:
            duration  属性为动画持续时间
            说明:     
                时间以毫秒为单位
    -->
</set>
4.2、scale 渐变尺寸伸缩动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
 
    <scale
        android:duration="1000"
        android:fillAfter="false"
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.4"
        android:toYScale="1.4" />
 
<!--
     尺寸伸缩动画效果 scale
       属性:interpolator 指定一个动画的插入器
        在我试验过程中,使用android.res.anim中的资源时候发现
        有三种动画插入器:
            accelerate_decelerate_interpolator  加速-减速 动画插入器
            accelerate_interpolator        加速-动画插入器
            decelerate_interpolator        减速- 动画插入器
        其他的属于特定的动画效果
      浮点型值:
         
            fromXScale 属性为动画起始时 X坐标上的伸缩尺寸    
            toXScale   属性为动画结束时 X坐标上的伸缩尺寸     
        
            fromYScale 属性为动画起始时Y坐标上的伸缩尺寸    
            toYScale   属性为动画结束时Y坐标上的伸缩尺寸    
        
            说明:
                 以上四种属性值    
    
                    0.0表示收缩到没有 
                    1.0表示正常无伸缩     
                    值小于1.0表示收缩  
                    值大于1.0表示放大
        
            pivotX     属性为动画相对于物件的X坐标的开始位置
            pivotY     属性为动画相对于物件的Y坐标的开始位置
        
            说明:
                    以上两个属性值 从0%-100%中取值
                    50%为物件的X或Y方向坐标上的中点位置
        
        长整型值:
            duration  属性为动画持续时间
            说明:   时间以毫秒为单位
 
        布尔型值:
            fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
-->
</set>
4.3 translate 画面转换位置移动动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
 
    <translate
        android:duration="2000"
        android:fromXDelta="30"
        android:fromYDelta="30"
        android:toXDelta="-80"
        android:toYDelta="300" />
    <!--
     translate 位置转移动画效果
        整型值:
            fromXDelta 属性为动画起始时 X坐标上的位置    
            toXDelta   属性为动画结束时 X坐标上的位置
            fromYDelta 属性为动画起始时 Y坐标上的位置
            toYDelta   属性为动画结束时 Y坐标上的位置
            注意:
                     没有指定fromXType toXType fromYType toYType 时候,
                     默认是以自己为相对参照物             
        长整型值:
            duration  属性为动画持续时间
            说明:   时间以毫秒为单位
    -->
</set>
4.4 rotate 画面转移旋转动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
 
    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="+350" />
    <!--
     rotate 旋转动画效果
       属性:interpolator 指定一个动画的插入器
             在我试验过程中,使用android.res.anim中的资源时候发现
             有三种动画插入器:
                accelerate_decelerate_interpolator   加速-减速 动画插入器
                accelerate_interpolator               加速-动画插入器
                decelerate_interpolator               减速- 动画插入器
             其他的属于特定的动画效果
                           
       浮点数型值:
            fromDegrees 属性为动画起始时物件的角度    
            toDegrees   属性为动画结束时物件旋转的角度 可以大于360度   
 
        
            说明:
                     当角度为负数——表示逆时针旋转
                     当角度为正数——表示顺时针旋转              
                     (负数from——to正数:顺时针旋转)   
                     (负数from——to负数:逆时针旋转) 
                     (正数from——to正数:顺时针旋转) 
                     (正数from——to负数:逆时针旋转)       
 
            pivotX     属性为动画相对于物件的X坐标的开始位置
            pivotY     属性为动画相对于物件的Y坐标的开始位置
                
            说明:        以上两个属性值 从0%-100%中取值
                         50%为物件的X或Y方向坐标上的中点位置
 
        长整型值:
            duration  属性为动画持续时间
            说明:       时间以毫秒为单位
    -->

五、Android动画--JavaCode

5.1、AlphaAnimation:

 /**
  * fromAlpha:动画开始时候透明度
  * toAlpha:动画结束时候透明度
  */
AlphaAnimation(float fromAlpha, float toAlpha)
AlphaAnimation alphaAnimation = new AlphaAnimation(0.1f,1.0f);
alphaAnimation.setDuration(1000);
alphaAnimation.start();

5.2、ScaleAnimation

/**
 * fromX为动画起始时 X坐标上的伸缩尺寸
 * toX为动画结束时 X坐标上的伸缩尺寸
 * fromY为动画起始时Y坐标上的伸缩尺寸
 * toY为动画结束时Y坐标上的伸缩尺寸
 以上四种属性值    
     0.0表示收缩到没有 
     1.0表示正常无伸缩     
     值小于1.0表示收缩  
     值大于1.0表示放大
 *
 * pivotXType为动画在X轴相对于物件位置类型  
 * pivotXValue为动画相对于物件的X坐标的开始位置
 * pivotXType为动画在Y轴相对于物件位置类型   
 * pivotYValue为动画相对于物件的Y坐标的开始位置
 */
ScaleAnimation(float fromX, float toX, float fromY, float toY,int pivotXType, float pivotXValue,
 int pivotYType, float pivotYValue)

5.3、TranslateAnimation

/**
 * fromXDelta为动画起始时 X坐标上的移动位置    
 * toXDelta为动画结束时 X坐标上的移动位置      
 * fromYDelta为动画起始时Y坐标上的移动位置     
 * toYDelta为动画结束时Y坐标上的移动位置
 */
TranslateAnimation(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta)
5.4、RotateAnimation

/**
 * fromDegrees为动画起始时的旋转角度
 * toDegrees为动画旋转到的角度
 * pivotXType为动画在X轴相对于物件位置类型 
 * pivotXValue为动画相对于物件的X坐标的开始位置
 * pivotXType为动画在Y轴相对于物件位置类型  
 * pivotYValue为动画相对于物件的Y坐标的开始位置
 */
RotateAnimation(float fromDegrees, float toDegrees,int pivotXType, float pivotXValue,
         int pivotYType, float pivotYValue)
以上就是Android补间动画、帧动画介绍和基本用法


六、属性动画

1、相关类:

ObjectAnimator:是ValueAnimator的一个子类,允许你设置一个目标对象和对象的属性进行动画,动画的执行类

ValueAnimator:属性动画主要的计时器,也计算动画后的属性的值,动画的执行类

AnimatorSet:提供组织动画的结构,使它们能相关联得运行,用于控制一组动画的执行

AnimatorInflater:用户加载属性动画的xml文件

TypeEvaluator:属性动画计算器,告诉了属性动画系统如何计算给出属性的值

TimeInterpolator:动画插入器,定义动画的变化率

2、基本用法:

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

  2.1、ObjectAnimator 

    相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。

ObjectAnimator是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的。

     

       xml中

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:propertyName="alpha"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:startOffset="200"
    android:valueFrom="0.0"
    android:valueTo="1.0"
    android:valueType="floatType">
 
 
    <!--
    duration 表示动画执行的时间
    propertyName 表示修改的物件的哪个属性值,这里是透明度
    valueFrom 表示从哪个状态值开始动画
    valueTo 表示到哪个状态值结束动画
    valueType 类型估值,主要用于设置动画操作属性的值
    repeatMode 表示重复的模式 reverse表示
    repeatCount 动画重复的计数,动画将会执行该值+1次
    repeatMode 动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变
    startOffset, 动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒
    interpolator 指定动画插入器
 
    -->
 
</objectAnimator>
      加载xml动画
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.animator_alpha);
anim.setTarget(view);
anim.start();
①、alpha


//第一个参数为 view对象,第二个参数为 动画改变的类型,第三,第四个参数依次是开始透明度和结束透明度。  
ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);  
 alpha.setDuration(2000);//设置动画时间  
alpha.setInterpolator(new DecelerateInterpolator());//设置动画插入器,减速  
alpha.setRepeatCount(-1);//设置动画重复次数,这里-1代表无限  
alpha.setRepeatMode(Animation.REVERSE);//设置动画循环模式。  
alpha.start();//启动动画。 
②、scale

AnimatorSet scale= new AnimatorSet();//组合动画  
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0f);  
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0f);  
scale.setDuration(2000);  
scale.setInterpolator(new DecelerateInterpolator());  
scale.play(scaleX).with(scaleY);//两个动画同时开始  
scale.start();
③、translate
ObjectAnimator translate= ObjectAnimator.ofFloat(view, "Y",view.getY(), 0);  
translate.setInterpolator(new DecelerateInterpolator());  
translate.setDuration(1500);  
translate.start(); 
④、rotate

AnimatorSet set = new AnimatorSet() ;               
ObjectAnimator anim = ObjectAnimator .ofFloat(view, "rotationX", 0f, 180f);   
anim.setDuration(2000);   
ObjectAnimator anim2 = ObjectAnimator .ofFloat(view, "rotationX", 180f, 0f);   
anim2.setDuration(2000);   
ObjectAnimator anim3 = ObjectAnimator .ofFloat(view, "rotationY", 0f, 180f);   
anim3.setDuration(2000);   
ObjectAnimator anim4 = ObjectAnimator .ofFloat(view, "rotationY", 180f, 0f);   
anim4.setDuration(2000);   
set.play(anim).before(anim2); //先执行anim动画之后在执行anim2  
set.play(anim3).before(anim4) ;   
set.start();  

⑤、改变背景(补间动画不能实现的)


ObjectAnimator translationUp = ObjectAnimator.ofInt(view, "backgroundColor", Color.RED, Color.BLUE, Color.GRAY,Color.GREEN);  
translationUp.setInterpolator(new DecelerateInterpolator());  
translationUp.setDuration(1500);  
translationUp.setRepeatCount(-1);  
translationUp.setRepeatMode(Animation.REVERSE);  
/**
 * ArgbEvaluator:这种评估者可以用来执行类型之间的插值整数值代表ARGB颜色。 
 * FloatEvaluator:这种评估者可以用来执行浮点值之间的插值。 
  * IntEvaluator:这种评估者可以用来执行类型int值之间的插值。 
  * RectEvaluator:这种评估者可以用来执行类型之间的插值矩形值。 
  * 由于本例是改变View的backgroundColor属性的背景颜色所以此处使用ArgbEvaluator 
   */  
translationUp.setEvaluator(new ArgbEvaluator());  
translationUp.start(); 

2.2、ValueAnimator

      ValueAnimator是整个属性动画机制当中最核心的一个类,前面我们已经提到了,属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。

基本用法跟ObjectAnimator相似。

2.3、AnimatorSet

AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 1.5f);
scaleXAnimator.setDuration(500);
scaleXAnimator.setRepeatCount(1);
scaleXAnimator.setRepeatMode(ValueAnimator.REVERSE);
scaleXAnimator.start();
 
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView, "scaleY", 1f, 1.5f);
scaleYAnimator.setDuration(500);
scaleYAnimator.setRepeatCount(1);
scaleYAnimator.setRepeatMode(ValueAnimator.REVERSE);
 
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
animatorSet.start();
  上述代码通过
playTogether函数实现两个动画同时执行,如果不想同时执行,也可以调用play函数返回AnimatorSet.Builder实例,AnimatorSet.Builder提供了如下几个函数用于实现动画组合:

after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行

也可以调用playSequentially函数实现分布执行动画。


2.4、TypeEvaluator  


ArgbEvaluator:这种评估者可以用来执行类型之间的插值整数值代表ARGB颜色。   

FloatEvaluator:这种评估者可以用来执行浮点值之间的插值。  

IntEvaluator:这种评估者可以用来执行类型int值之间的插值。 

RectEvaluator:这种评估者可以用来执行类型之间的插值矩形值。 

 
2.5、TimeInterpolator 


 AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速

  AccelerateInterpolator  在动画开始的地方速率改变比较慢,然后开始加速

  AnticipateInterpolator 开始的时候向后然后向前甩

  AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值

  BounceInterpolator   动画结束的时候弹起

  CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

  DecelerateInterpolator 在动画开始的地方快然后慢

  LinearInterpolator   以常量速率改变

  OvershootInterpolator    向前甩一定值后再回到原来位置

2.6、PropertyValuesHolder:PropertyValuesHolder这个类可以先将动画属性和值暂时的存储起来,后一起执行,在有些时候可以使用替换掉AnimatorSet,减少代码量。


PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("rotationX", 0f, 180, 360f);
ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ).setDuration(2000).start();
      PropertyValuesHolder 只能实现同时执行的动画组合相比AnimatorSet就没那么丰富了,PropertyValuesHolder 提供的函数方法有如下几种:ofInt()、ofFloat()、ofObject()、ofKeyframe()。
2.7、ViewPropertyAnimator

ViewPropertyAnimator viewPropertyAnimator=view.animate();
viewPropertyAnimator.scaleXBy(1.0f).scaleX(1.5f).scaleYBy(1.0f).scaleY(1.5f).setDuration(500).start();
多属性动画,作用于View,能够实现的动画相对单一,只能实现比如缩放,透明度改变,平移、旋转等,具体函数名字:
平移 translationX,translationY, X,Y,缩放 scaleX,scaleY, 旋转 rotationX, rotationY,
透明度 alpha

3、设置动画监听器


objectAnimator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
        //TODO 动画开始前的操作
    }
 
    @Override
    public void onAnimationEnd(Animator animation) {
        //TODO 动画结束的操作
    }
 
    @Override
    public void onAnimationCancel(Animator animation) {
       //TODO 动画取消的操作
    }
 
    @Override
    public void onAnimationRepeat(Animator animation) {
        //TODO 动画重复的操作
    }
    });
如果我们需要简单动画执行过程中的变化可以使用AnimatorUpdateListener

objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float value = (float) animation.getAnimatedValue();
        //可以根据自己的需要来获取动画更新值。
        Log.e("AnimatorUpdateListener", "the animation value is " + value);
    }
    });

4、属性动画实例

ObjectAnimator moveIn = ObjectAnimator.ofFloat(imageView, "translationX",-720, 220,0);
ObjectAnimator moveY = ObjectAnimator.ofFloat(imageView, "translationY",0, 1080,0);
ObjectAnimator rotate = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 180f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(moveIn).with(fadeInOut).with(rotate).with(moveY);
animSet.setDuration(10000);
animSet.start();

以上就是android view动画,仅供大家参考。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值