【Android程序开发】动画-补间动画(TweenAnimation)

心得体会

  • 有时候从一而终很重要,我这篇简书之前写了一半,然后因为时间原因,就隔了好久,后面想把它补上发现自己没有任何思绪,只能把之前的视频又翻出来看了看~~

目录

  • 1.补间动画简介

  • 2.XML实现补间动画

  • 3.代码实现补间动画

  • 4.补间动画的缺点与不足

具体内容

一、补间动画简介

补间动画(TweenAnimation)也叫做View动画

  • 1.补间动画只关心开始和结束两个状态 中间的状态由系统自动补全
    1. 因为它的作用对象是View,它支持平移、缩放、旋转和透明度四种变换效果
名称 标签 子类 效果
平移动画 <translate> TranslateAnimation 移动
缩放动画 <scale> ScaleAnimation 放大或缩小
旋转动画 <rotate> RotateAnimation 旋转
透明度动画 <alpha> AlphaAnimation 改变透明度

二、XML实现补间动画

XML实现补间动画,即通过在XML文件中设置相关属性来达到动画的效果(补间动画的XML文件必须放置在res/anmi/ 文件夹中)

1.在res下创建一个anim文件
  • 1.切换到project目录


    image.png
  • 2.在src/main/res/目录下new(新建)Directory
    image.png
  • 3.命名为anim,然后返回到Android目录,新建一个Animation resource file
    image.png
2.Animation resource file里面共有属性
属性 描述
fillAfter 动画结束后View是否停留在结束位置,true表示停留在结束位置
duration 动画的持续时间,单位为ms
startOffset 动画执行延迟的时间,单位为ms
interpolator 用于控制动画在不同时段的执行速度,默认是加减速插值器
repeatMode 有两个取值:restart和reverse,reverse表示动画正反轮流执行,restart表示一直从头开始执行
repeatCount 动画的重复次数,默认为0,即不重复
zAdjustment 在执行动画过程中调整Z轴的位置,有三个取值可选:normal、top和bottom,默认为normal
3.Animation resource file里面各类标签

3.1.set标签

  • <set>标签表示的是动画集合,它可以包含若干个动画,并且其内部也是可以嵌套其他动画集合的。它有两个可指定的属性值如下:
属性 描述
interpolator 表示动画集合所采用的插值器,默认为加减速插值器
shareInterpolator 表示集合中的动画是否和集合共享同一个插值器。如果集合不指定插值器,那么子动画就需要单独指定所需的插值器或使用默认值

3.2.translate标签

  • <translate>标签用于控制平移动画,它可以使一个View在水平/竖直方向上完成平移的动画效果,它的一系列属性含义如下表所示:
属性 描述
fromXDelta 表示 x 的起始值
toXDelta 表示 x 的结束值
fromYDelta 表示 y的起始值
toYDelta 表示 y的结束值

3.3.scale标签

  • <scale>标签表示缩放动画,它可以使View具有放大/缩小的效果,它的一系列属性含义如下表所示:
属性 描述
fromXScale 水平方向缩放的起始值
toXScale 水平方向缩放的结束值
fromYScale 竖直方向缩放的起始值
toYScale 竖直方向缩放的结束值
pivotX 缩放的轴点的 x 坐标
pivotY 缩放的轴点的 y 坐标

3.4.rotate标签

  • <rotate>标签表示旋转动画,它可以使View具有旋转的效果,它的一系列属性含义如下表所示:
属性 描述
fromDegrees 旋转开始的角度
toDegrees 旋转结束的角度
fromYScale 竖直方向缩放的起始值
pivotX 旋转的轴点的 x 坐标
pivotY 旋转的轴点的 y 坐标

3.5.alpha标签

  • <alpha>标签表示透明度动画,它可以改变View的透明度,它的一系列属性含义如下表所示:
属性 描述
fromAlpha 表示透明度的起始值
toAlpha 表示透明度的结束值

实例分析:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fillAfter="true"
    android:repeatMode="reverse">
    <!--translate标签:表示View的x坐标从0平移到300-->
    <translate android:fromXDelta="0"
        android:toXDelta="300" />
    <!--alpha标签:表示将View的透明度从完全透明变为完全不透明-->
    <alpha android:fromAlpha="0"
        android:toAlpha="1.0"/>
    <!--scale标签:表示将View从原来的0倍放大到原来的1.0倍,以View中心为轴点进行缩放(默认情况下轴点会为View的左上角)-->
    <scale android:fromXScale="0"
        android:toXScale="1.0"
        android:fromYScale="0"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        />
   <!--rotate标签:表示View从0°到360°,以View中心为轴点进行旋转(默认情况下轴点会为View的左上角)-->
    <rotate android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"/>
</set>

三、代码实现补间动画

  • 在Java中,translate、scale、rotate、alpha、set分别对应下面的几个类:
    1. TranslateAnimation
    TranslateAnimation 有三个构造方法来创建对象,这三个构造方法的说明如下所示:
public TranslateAnimation(Context context, AttributeSet attrs)
参数 含义
context 上下文对象
attrs xml中读取的属性设置
public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
参数 含义
fromXDelta 动画开始时x的取值,单位为px
toXDelta 动画结束时x的取值,单位为px
fromYDelta 动画开始时y的取值,单位为px
toYDelta 动画结束时y的取值,单位为px
public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
        int fromYType, float fromYValue, int toYType, float toYValue)
参数 含义
fromXType 动画开始时x的取值类型
fromXValue 动画开始时x的取值,其取值受fromXType影响
toXType 动画结束时x的取值,其取值受toXType影响
toXValue 动画结束时x的取值,其取值受toXType影响
fromYType 动画开始时y的取值类型
fromYValue 动画开始时y的取值,其取值受fromYType影响
toYType 动画结束时y的取值,其取值受toYType影响
toYValue t动画结束时y的取值,其取值受toYType影响
  • 在这个构造方法中,Type 的取值有如下三个,它们的描述如下表所示:
Type 描述
Animation.ABSOLUTE 取绝对值,所取值表示像素值的大小,单位为px
Animation.RELATIVE_TO_SELF 相对自身的百分比取值,所取值表示相对自身长/宽的百分比
Animation.RELATIVE_TO_PARENT 相对父布局的百分比取值,所取值表示相对父布局长/宽的百分比

2. ScaleAnimation
ScaleAnimation有4个构造方法来创建对象,它们的说明如下所示:

public ScaleAnimation(Context context, AttributeSet attrs)
参数 含义
context 上下文对象
attrs xml中读取的属性设置
public ScaleAnimation(float fromX, float toX, float fromY, float toY)
参数 含义
fromX x开始时的缩放比例
toX x结束时的缩放比例
fromY y开始时的缩放比例
toY y结束时的缩放比例
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
        float pivotX, float pivotY)
参数 含义
fromX x开始时的缩放比例
toX x结束时的缩放比例
fromY y开始时的缩放比例
toY y结束时的缩放比例
pivotX 缩放轴点的x坐标,单位为px
pivotY 缩放轴点的y坐标,单位为px
public ScaleAnimation(float fromX, float toX, float fromY, float toY,
        int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数 含义
fromX x开始时的缩放比例
toX x结束时的缩放比例
fromY y开始时的缩放比例
toY y结束时的缩放比例
pivotXType 缩放轴点x的取值类型
pivotXValue 缩放轴点的x的取值,其取值受pivotXType影响
pivotYType 缩放轴点y的取值类型
pivotYValue 缩放轴点的y的取值,其取值受pivotYType影响

3. RotateAnimation
RotateAnimation 同样有4个方法来创建对象,说明如下所示:

public RotateAnimation(Context context, AttributeSet attrs)
参数 含义
context 上下文对象
attrs xml中读取的属性设置
public RotateAnimation(float fromDegrees, float toDegrees)
参数 含义
fromDegrees 开始旋转时的角度值
toDegrees 旋转结束时的角度值
public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
参数 含义
fromDegrees 开始旋转时的角度值
toDegrees 旋转结束时的角度值
pivotX 轴点的x坐标,单位为px
pivotY 轴点的y坐标,单位为px
public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
        int pivotYType, float pivotYValue)
参数 含义
fromDegrees 开始旋转时的角度值
toDegrees 旋转结束时的角度值
pivotXType 轴点x的取值类型
pivotXValue 轴点的x的取值,其取值受pivotXType影响
pivotYType 轴点y的取值类型
pivotYValue 轴点的y的取值,其取值受pivotYType影响

4. AlphaAnimation
AlphaAnimation 应当是这所有动画类型里面最为简单的了,它只有以下两个构造方法:

public AlphaAnimation(Context context, AttributeSet attrs)
参数 含义
context 上下文对象
attrs xml中读取的属性设置
public AlphaAnimation(float fromAlpha, float toAlpha)
参数 含义
fromAlpha 动画开始时的透明度,0表示完全透明,1表示完全不透明
toAlpha 动画结束时的透明度,0表示完全透明,1表示完全不透明

代码创建补间动画小例子

  • XML里面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
<View
    android:id="@+id/iv_anim"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:background="@color/colorAccent"/>
</RelativeLayout>
  • MainActivity里面
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            //1.找到需要动画的控件
            View v =findViewById(R.id.iv_anim);
            //2.创建动画
         //AlphaAnimation alpha=new AlphaAnimation(0,1);
         //alpha.setDuration(1000);
         //alpha.setFillAfter(true);
            RotateAnimation  rotate=new RotateAnimation(0,360,(float)(0.5*v.getWidth()),(float)(0.5*v.getHeight()));
            rotate.setDuration(1000);
         //  v.startAnimation(alpha);
            //3.开启动画
            v.startAnimation(rotate);
        }
        return true;
    }
}
  • 运行结果
    20191029_204630.gif

四、补间动画的缺点与不足

  • 1.没有改变View的属性:补间动画只是改变视觉效果,例如将一个按钮移动到某个位置之后,点击移动后的按钮并无响应点击事件,而点击按钮移动前的位置则响应了点击事件,说明View只是改变了视觉效果,并没有改变实际位置
  • 2.作用对象的局限性: 补间动画的作用对象只能是View,无法对非View的对象进行动画操作
  • 3.动画效果单一:补间动画只能出现平移、缩放、旋转、透明度等简单的功能,一旦遇到相对复杂的动画效果,即超出了上述4种动画效果,那么补间动画则无法实现。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 【Android 动画】 动画分类补间动画(Tween动画)帧动画(Frame 动画)属性动画(Property ...
    Rtia阅读 6,121评论 1 38
  • 概述 在Android开发的过程中,View的变化是很常见的,如果View变化的过程没有动画来过渡而是瞬间完成,会...
    小芸论阅读 38,957评论 18 134
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,699评论 0 10
  • 转载一篇高质量博文,原地址请戳这里转载下来方便今后查看。1 背景不能只分析源码呀,分析的同时也要整理归纳基础知识,...
    Elder阅读 1,939评论 0 24
  • 动画基础概念 动画分类 Android 中动画分为两种,一种是 Tween 动画、还有一种是 Frame 动画。 ...
    Rtia阅读 1,223评论 0 6