补间动画,帧动画

Android 动画详解

开始的时候先思考几个问题
1. android 动画是什么
2. android 动画的分类
3. android 动画怎么实现
4. android 动画实现的原理

第一个问题:android 动画是什么

这个问题很明显了 就不用回答了

第二个问题:android动画的分类

android 动画一共分为三类
1. View Animation 也叫补间动画,是android提供的最早的一种动画实现形式
2. Drawable Animation 这种动画(也叫Frame动画、帧动画)其实可以划分到视图动画的类别,专门用来一个一个的显示Drawable的resources,就像放幻灯片一样。
3. Property Animation: 属性动画只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让你自定义任何类型和属性的动画。

第三个问题android 动画怎么实现

View Animation (补间动画)
补间动画一共有两种实现形式 1、xml形式的实现 通常是在res/anim/xxx.xml 中实现 2、是利用java代码实现
1. xml形式:
淡入淡出模式 Alpha属性详解
`

<!--
 fromAlpha :动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
 toAlpha:  动画结束的透明度,同上
  duration:动画持续时间
    -->
 <alpha android:fromAlpha="1.0"
     android:toAlpha="0.0"
     android:duration = "1000"/>
`  

旋转形式 Rotate属性详解

`<!-- 
fromDegrees :开始时的角度  
toDegrees:结束时的角度
pivotx:用于设置旋转时X值的坐标
1 当值为 50 表示使用绝对位置定位
2 当值为 50% 相对于自身的坐标
3 当值为 50%p 相对于父控件的坐标
-->
<rotate android:fromDegrees="0"  
    android:toDegrees="360"  
    android:pivotX="50%"  
    android:pivotY="50%"  
    android:duration = "1000"  
    /> ` 

缩放形式 Scale属性详解

`<!--
 fromXScale 初始X轴缩放比例,1.0表示无变化
 toXScale:结束X轴缩放比例
 fromYScale:初始Y轴缩放比例
 toYScale:结束Y轴缩放比例
  pivotX:缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、5
          0%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
  pivotY:缩放起点Y轴坐标,同上规律
-->
<scale
    android:duration="1000"
    android:fromXScale="1"
    android:fromYScale="1"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0.5"
    android:toYScale="0.5" />`

移动形式 Translate属性详解

`<!-- fromXDelta: 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加  50px为初始点
                 、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
     toXDelta:结束点X轴坐标,同上规律
     fromYDelta:起始点Y轴坐标,同上规律
     toYDelta:结束点X轴坐标,同上规律
-->
<translate
    android:fromXDelta="0"
    android:toXDelta="500"
    android:fromYDelta="0"
    android:duration = "1000"
    android:toYDelta="500" />`  

组合动画:通过上面对于动画的属性介绍之后我们来看看在Android中这些动画组合使用用set属性包裹按照顺序依次执行,代码如下:

`<rotate android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration = "1000"
    />
<translate
    android:fromXDelta="0"
    android:toXDelta="500"
    android:fromYDelta="0"
    android:duration = "1000"
    android:toYDelta="500" />`

2.代码形式:

淡入淡出模式 Alpha属性详解

`AnimationSet animationSet = new AnimationSet(true);
            AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);
            animationSet.setDuration(1000);
            animationSet.addAnimation(alphaAnimation);
            img.startAnimation(animationSet);`  

旋转形式 Rotate属性详解:

`AnimationSet animationSet = new AnimationSet(true);
            /**
             * 参数1: 从哪个角度开始旋转
             * 参数2: 转到什么角度
             * 后面四个参数是关于圆心位置的设置
             * 参数3:x轴的坐标类型 ABSOLUTE 绝对坐标 RELATIVE_TO_SELF相对于自身的坐标 RELATIVE_TO_PARENT相对于父控件的坐标
             *
             */
            RotateAnimation rotateAnimation = new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
            animationSet.setDuration(1000);
            animationSet.addAnimation(rotateAnimation);
            img.startAnimation(animationSet);`  

缩放形式 Scale属性详解:

`AnimationSet animationSet = new AnimationSet(true);
            /**
             * 参数1 x轴的初始值
             * 参数2 x轴收缩都的值
             * 参数3 y轴的初始值
             * 参数4 y轴收缩的值
             */
            ScaleAnimation scaleAnimation = new ScaleAnimation(0,0.5f,0,0.5f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
            animationSet.addAnimation(scaleAnimation);
            animationSet.setDuration(2000);
            img.startAnimation(animationSet);`  

移动形式 Translate属性详解 :

`AnimationSet animationSet = new AnimationSet(true);
            /**
             * 参数1 2 x轴开始的位置
             * 参数3 4 y轴开始的位置
             * 参数5 6 x轴结束的位置
             * 参数7 8 y轴结束的位置
             */
            TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1);
            animationSet.addAnimation(translateAnimation);
            animationSet.setDuration(2000);
            img.startAnimation(animationSet);`  

**组合形式:**java代码太简单了 这里就不多做累述了

AnimationSet:
在上述代码中可以看出来动画的实现是用AnimationSet,AnimationSet继承自Animation,是上面四种的组合容器管理类,没有自己特有的属性,他的属性继承自Animation,所以特别注意,当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。

Animation 属性:

View与动画相关的属性

插值器使用方法

首先要了解为什么需要插值器,因为在补间动画中,我们一般只定义关键帧(首帧或尾帧),然后由系统自动生成中间帧,生成中间帧的这个过程可以成为“插值”。插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速等。下面是几种常见的插值器:
Interpolator对象资源ID功能作用。

AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator先加速再减速
AccelerateInterpolator@android:anim/accelerate_interpolator加速
AnticipateInterpolator@android:anim/anticipate_interpolator先回退一小步然后加速前进
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator在上一个基础上超出终点一小步再回到终点
BounceInterpolator@android:anim/bounce_interpolator最后阶段弹球效果
CycleInterpolator@android:anim/cycle_interpolator周期运动
DecelerateInterpolator@android:anim/decelerate_interpolator减速
LinearInterpolator@android:anim/linear_interpolator匀速
OvershootInterpolator@android:anim/overshoot_interpolator快速到达终点并超出一小步最后回到终点

插值器使用法:
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”

Drawable Animation(帧动画动画)使用详解

Drawable动画其实就是Frame动画(帧动画),它允许你实现像播放幻灯片一样的效果,这种动画的实质其实是Drawable,所以这种动画的XML定义方式文件一般放在res/drawable/目录下。具体关于帧动画方式有xm方式,java方式。其中最常用的是xml方式

xml方式:
必须是根节点,包含一个或者多个元素,属性有:
android:oneshot true代表只执行一次,false循环执行。
类似一帧的动画资源。
animation-list的子项,包含属性如下:
- android:drawable 一个frame的Drawable资源。
- android:duration 一个frame的Drawable资源的持续时间。

`<!-- 注意:rocket.xml文件位于res/drawable/目录下 -->
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
    android:drawable="@[package:]drawable/drawable_resource_name"
    android:duration="integer" />
</animation-list>`

Java代码:

    `AnimationDrawable  animation = (AnimationDrawable) img.getBackground();  
    animation.start();`

animation.start()在onCreate()方法中动画是没法实现的。因为当我们在onCreate中调用AnimationDrawable的start方法时,窗口Window对象还没有完全初始化,AnimationDrawable不能完全追加到窗口Window对象中需要把这段代码放在onWindowFocusChanged方法中,当Activity展示给用户时,onWindowFocusChanged方法就会被调用,我们正是在这个时候实现我们的动画效果。当然,onWindowFocusChanged是在onCreate之后被调用的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值