我的Android开发之旅(二):Android三种动画效果的浅入之View动画

我的Android开发之旅(二):Android三种动画效果的浅入之View动画,第1张

概述我的Android开发之旅(二):Android三种动画效果的浅入之View动画前言View动画Animation类1.平移动画2.缩放动画3.旋转动画4.透明动画AnimationSet动画集合自定义View动画补充前言在Android中动画可以分为3种:View动画、帧动画和属性动画。View动画从名字就可以大致知道,Vie

我的AndroID开发之旅(二):AndroID三种动画效果的浅入之VIEw动画前言View动画Animation类1. 平移动画2. 缩放动画3. 旋转动画4. 透明动画AnimationSet 动画集合自定义View动画补充

前言

在AndroID中动画可以分为3种:VIEw动画、帧动画和属性动画。VIEw动画从名字就可以大致知道,VIEw动画是对VIEw做图形变换(平移、缩放、旋转、透明度)从而产生动画效果,并且VIEw动画支持自定义。帧动画是通过顺序播放一系列的图片从而产生的动画效果。属性动画是在API11(AndroID3.0)引进的动画效果,它是通过动态地改变对象的属性从而达到动画效果。

VIEw动画

VIEw动画的作用对象是VIEw,它支持4种动画效果,分别是平移、缩放、旋转、透明度动画。VIEw动画的四种动画效果对应着Animation类的四个子类:
TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。这4种动画即可以通过XML来定义,也能通过Java代码来动态创建。对于VIEw动画来说,推荐使用XML来定义,可读性高。

名称标签子类效果
平移动画< translate >TranslateAnimation移动VIEw
缩放动画< scale >ScaleAnimation放大或缩小VIEw
旋转动画< rotate >RotateAnimation旋转VIEw
透明度动画< Alpha >AlphaAnimation改变VIEw的透明度

Animation类

在实现动画效果之前,先讲一下Animation类,它是一个抽象类,可以应用于视图、表面或其他对象的动画。
Animation一些常用的方法:

Animation类常用的方法作用
reset()重置Animation的初始化
cancel()取消Animation动画
start()开始Animation动画
setAnimationListener()给当前Animation设置动画监听
hasstarted()判断当前Animation是否开始
hasEnded()判断当前Animation是否结束

VIEw类对Animation的常用方法:

方法作用
startAnimation(Animation animation)对当前VIEw开始设置的Animation动画
clearanimation()取消当VIEw在执行的Animation动画

Animation常用的属性:

xml属性java方法作用
androID:durationsetDuration(long)动画持续时间,毫秒为单位
androID:fillAftersetFillAfter(boolean)控件动画结束时是否保持动画最后的状态
androID:fillBeforesetDuration(long)动画持续时间,毫秒为单位
androID:durationsetFillBefore(boolean)控件动画结束时是否还原到开始动画前的状态
androID:ShareInterpolatorsetInterpolator(Interpolator)设定插值器(指定的动画效果,譬如回d等)
androID:startOffsetsetStartOffset(long)调用start函数之后等待开始运行的时间,单位为毫秒

上面的表格中涉及到 插值器 。那么什么是插值器呢?官方的注释解释道:插值器定义了动画的变化率。这允许基本的动画效果(透明,缩放,平移,旋转)被加速,减速,重复等。


通过上图可以看到,官方定义了一个插值器的接口,这就意味着我们可以自己定义或是用官方提供的插值器,官方提供的插值器如下:

xmljava作用
AccelerateDecelerateInterpolator@androID:anim/accelerate_decelerate_interpolator其变化开始和结束速率较慢,中间加速
AccelerateInterpolator@androID:anim/accelerate_interpolator其变化开始速率较慢,后面加速
DecelerateInterpolator@androID:anim/decelerate_interpolator其变化开始速率较快,后面减速
linearInterpolator@androID:anim/linear_interpolator其变化速率恒定
AnticipateInterpolator@androID:anim/anticipate_interpolator其变化开始向后甩,然后向前
AnticipateOvershootInterpolator@androID:anim/anticipate_overshoot_interpolator其变化开始向后甩,然后向前甩,过冲到目标值,最后又回到了终值
OvershootInterpolator@androID:anim/overshoot_interpolator其变化开始向前甩,过冲到目标值,最后又回到了终值
BounceInterpolator@androID:anim/bounce_interpolator其变化在结束时反d
CycleInterpolator@androID:anim/cycle_interpolator循环播放,其速率为正弦曲线
TimeInterpolator一个接口,可以自定义插值器
1. 平移动画

平移的动画效果用到了 TranslateAnimation 类,TranslateAnimation属性如下:

xml属性java方法作用
androID:fromXDeltaTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)起始点X轴坐标,数值,百分比,百分比p
androID:toXDeltaTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)结束点X轴坐标,数值,百分比,百分比p
androID:fromYDeltaTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)起始点Y轴坐标,这里可以是数值,百分比,百分比p
androID:toYDeltaTranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)结束点Y轴坐标,这里可以是数值,百分比,百分比p
@H_599_419@

数值、百分数、百分数p,譬如50表示以当前VIEw左上角坐标加50px为初始点、50%表示以当前VIEw的左上角加上当前VIEw宽高的50%做为初始点、50%p表示以当前VIEw的左上角加上父控件宽高的50%做为初始点。如果不太明白,可以自己动手试试,看看效果。

首先要创建XML文件,我们需要在res下新建anim文件夹,接着在anim下创建animation resource file的xml文件,然后新建一个 translate_anim.xml


编辑 translate_anim.xml 文件如下:

<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:duration="2000">    <translate        androID:fromXDelta="0"        androID:toXDelta="0"        androID:fromYDelta="0"        androID:toYDelta="800"/></set>

接着我们打开 activity_main.xml 文件,添加 button 和 TextVIEw。 button 用来开启动画效果, TextVIEw 用来显示动画效果。

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:gravity="center_horizontal"    androID:orIEntation="vertical"    tools:context=".MainActivity">    <linearLayout        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_margin="10dp"        androID:gravity="center"        androID:orIEntation="horizontal">        <button            androID:ID="@+ID/btnTranslation"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="向下平移" />            </linearLayout>    <TextVIEw        androID:ID="@+ID/tvAnimation"        androID:layout_wIDth="200dp"        androID:layout_height="50dp"        androID:background="#2196F3"        androID:gravity="center"        androID:text="动画效果" /></linearLayout>

布局设置好之后我们再到 MainActivity.java 文件中给 btnTranslation 添加点击事件,实现向下平移的效果。

@H_599_419@

这里我推荐大家用 ButterKnife 通过注解的方式绑定 VIEw 就不需要 findByID() 了,配合插件(butterknife-zelezny)控件的绑定和点击事件代码一键生成,提高你的工作效率,美滋滋。

/** * @author Leung * @date 2020/4/16 16:52 */public class MainActivity extends AppCompatActivity {    @BindVIEw(R.ID.tvAnimation)    TextVIEw tvAnimation;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        ButterKnife.bind(this);    }    @OnClick(R.ID.btnTranslation)    public voID onVIEwClicked(VIEw vIEw) {        // 方法一:通过xml方式实现动画效果        Animation animation = null;        switch (vIEw.getID()) {            case R.ID.btnTranslation:                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);                break;            default:        }        tvAnimation.startAnimation(animation);//        // 方法二:通过代码动态的实现动画效果//        TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);//        translateAnimation.setDuration(2000);//        tvAnimation.startAnimation(translateAnimation);    }}

动画效果:

2. 缩放动画

缩放的动画效果用到了 ScaleAnimation 类,ScaleAnimation属性如下:

xml属性java方法作用
androID:fromXScaleScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)X轴开始的缩放比例,1.0表示无变化
androID:toXScaleScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)X轴结束的缩放比例
androID:fromYScaleScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)Y轴开始的缩放比例,1.0表示无变化
androID:toYScaleScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)Y轴结束的缩放比例
androID:pivotXScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)X轴的缩放起始点(当对象改变大小时,这个点保持不变)这里可以是数值,百分比,百分比p
androID:pivotYScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)Y轴的缩放起始点(当对象改变大小时,这个点保持不变)这里可以是数值,百分比,百分比p
@H_599_419@

数值、百分数、百分数p,譬如50表示以当前VIEw左上角坐标加50px为初始点、50%表示以当前VIEw的左上角加上当前VIEw宽高的50%做为初始点、50%p表示以当前VIEw的左上角加上父控件宽高的50%做为初始点。如果不太明白,可以自己动手试试,看看效果。

缩放动画效果的创建也是一样,这里我就不详细说明了,创建 scale_anim.xml 和 修改 activity_main.xml、MainActivity.java ,代码如下:

scale_anim.xml 文件

<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:duration="2000">    <scale        androID:fromXScale="1.0"        androID:toXScale="2.0"        androID:fromYScale="1.0"        androID:toYScale="2.0"        androID:pivotX="50%"        androID:pivotY="50%"/></set>

activity_main.xml 文件

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:gravity="center_horizontal"    androID:orIEntation="vertical"    tools:context=".MainActivity">    <linearLayout        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_margin="10dp"        androID:gravity="center"        androID:orIEntation="horizontal">        <button            androID:ID="@+ID/btnTranslation"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="向下平移" />        <button            androID:ID="@+ID/btnScale"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="缩放动画" />    </linearLayout>    <TextVIEw        androID:ID="@+ID/tvAnimation"        androID:layout_wIDth="200dp"        androID:layout_height="50dp"        androID:background="#2196F3"        androID:gravity="center"        androID:text="动画效果" /></linearLayout>

MainActivity.java 文件

/** * @author Leung * @date 2020/4/16 16:52 */public class MainActivity extends AppCompatActivity {    @BindVIEw(R.ID.tvAnimation)    TextVIEw tvAnimation;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        ButterKnife.bind(this);    }    @OnClick({R.ID.btnTranslation, R.ID.btnScale})    public voID onVIEwClicked(VIEw vIEw) {        // 方法一:通过xml方式实现动画效果        Animation animation = null;        switch (vIEw.getID()) {            case R.ID.btnTranslation:                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);                break;            case R.ID.btnScale:                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);            default:        }        tvAnimation.startAnimation(animation);        // 方法二:通过代码动态的实现动画效果//        TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);//        translateAnimation.setDuration(2000);//        tvAnimation.startAnimation(translateAnimation);//        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, tvAnimation.getWIDth() / 2, tvAnimation.getHeight() / 2);//        scaleAnimation.setDuration(2000);//        tvAnimation.startAnimation(scaleAnimation);    }}

动画效果:

3. 旋转动画

旋转的动画效果用到了 RotateAnimation 类,RotateAnimation属性如下:

xml属性java方法作用
androID:fromdegreesRotateAnimation(float fromdegrees, float todegrees, float pivotX, float pivotY)动画开始时的角度,正数代表顺时针,负数代表逆时针
androID:todegreesRotateAnimation(float fromdegrees, float todegrees, float pivotX, float pivotY)动画结束时的角度,正数代表顺时针,负数代表逆时针
androID:pivotXRotateAnimation(float fromdegrees, float todegrees, float pivotX, float pivotY)X轴的旋转起始点,这里可以是数值,百分比,百分比p
androID:pivotYRotateAnimation(float fromdegrees, float todegrees, float pivotX, float pivotY)Y轴的旋转起始点,这里可以是数值,百分比,百分比p

rotate_anim.xml 文件

<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:duration="2000">    <rotate        androID:fromdegrees="0"        androID:todegrees="360"        androID:pivotX="50%"        androID:pivotY="50%"/></set>

activity_main.xml 文件

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:gravity="center_horizontal"    androID:orIEntation="vertical"    tools:context=".MainActivity">    <linearLayout        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_margin="10dp"        androID:gravity="center"        androID:orIEntation="horizontal">        <button            androID:ID="@+ID/btnTranslation"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="向下平移" />        <button            androID:ID="@+ID/btnScale"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="缩放动画" />        <button            androID:ID="@+ID/btnRotate"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="旋转动画" />    </linearLayout>    <TextVIEw        androID:ID="@+ID/tvAnimation"        androID:layout_wIDth="200dp"        androID:layout_height="50dp"        androID:background="#2196F3"        androID:gravity="center"        androID:text="动画效果" /></linearLayout>

MainActivity.java 文件

@OnClick({R.ID.btnTranslation, R.ID.btnScale, R.ID.btnRotate})    public voID onVIEwClicked(VIEw vIEw) {        // 方法一:通过xml方式实现动画效果        Animation animation = null;        switch (vIEw.getID()) {            case R.ID.btnTranslation:                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);                break;            case R.ID.btnScale:                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);                break;            case R.ID.btnRotate:                animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);                break;            default:        }        tvAnimation.startAnimation(animation);        // 方法二:通过代码动态的实现动画效果//        TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);//        translateAnimation.setDuration(2000);//        tvAnimation.startAnimation(translateAnimation);//        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, tvAnimation.getWIDth() / 2, tvAnimation.getHeight() / 2);//        scaleAnimation.setDuration(2000);//        tvAnimation.startAnimation(scaleAnimation);//        RotateAnimation rotateAnimation = new RotateAnimation(0, 360, tvAnimation.getWIDth() / 2, tvAnimation.getHeight() / 2);//        rotateAnimation.setDuration(2000);//        tvAnimation.startAnimation(rotateAnimation);    }

动画效果:

4. 透明动画

透明的动画效果用到了 AlphaAnimation 类,AlphaAnimation属性如下:

xml属性java方法作用
androID:fromAlphaAlphaAnimation(float fromAlpha, float toAlpha)动画开始时的透明度(范围:0.0-1.0,1.0不透明,0.0全透明)
androID:toAlphaAlphaAnimation(float fromAlpha, float toAlpha)动画结束时的透明度(范围:0.0-1.0,1.0不透明,0.0全透明)

Alpha_anim.xml 文件

<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:duration="2000">    <Alpha        androID:fromAlpha="1"        androID:toAlpha="0"/></set>

activity_main.xml 文件

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:gravity="center_horizontal"    androID:orIEntation="vertical"    tools:context=".MainActivity">    <linearLayout        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_margin="10dp"        androID:gravity="center"        androID:orIEntation="horizontal">        <button            androID:ID="@+ID/btnTranslation"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="向下平移" />        <button            androID:ID="@+ID/btnScale"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="缩放动画" />        <button            androID:ID="@+ID/btnRotate"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="旋转动画" />        <button            androID:ID="@+ID/btnAlpha"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="透明动画" />    </linearLayout>    <TextVIEw        androID:ID="@+ID/tvAnimation"        androID:layout_wIDth="200dp"        androID:layout_height="50dp"        androID:background="#2196F3"        androID:gravity="center"        androID:text="动画效果" /></linearLayout>

MainActivity.java 文件

@OnClick({R.ID.btnTranslation, R.ID.btnScale, R.ID.btnRotate, R.ID.btnAlpha})    public voID onVIEwClicked(VIEw vIEw) {        // 方法一:通过xml方式实现动画效果        Animation animation = null;        switch (vIEw.getID()) {            case R.ID.btnTranslation:                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);                break;            case R.ID.btnScale:                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);                break;            case R.ID.btnRotate:                animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);                break;            case R.ID.btnAlpha:                animation = AnimationUtils.loadAnimation(this, R.anim.Alpha_anim);                break;            default:        }        tvAnimation.startAnimation(animation);        // 方法二:通过代码动态的实现动画效果//        TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);//        translateAnimation.setDuration(2000);//        tvAnimation.startAnimation(translateAnimation);//        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, tvAnimation.getWIDth() / 2, tvAnimation.getHeight() / 2);//        scaleAnimation.setDuration(2000);//        tvAnimation.startAnimation(scaleAnimation);//        RotateAnimation rotateAnimation = new RotateAnimation(0, 360, tvAnimation.getWIDth() / 2, tvAnimation.getHeight() / 2);//        rotateAnimation.setDuration(2000);//        tvAnimation.startAnimation(rotateAnimation);//        AlphaAnimation AlphaAnimation = new AlphaAnimation(1.0f, 0.0f);//        AlphaAnimation.setDuration(2000);//        tvAnimation.setAnimation(AlphaAnimation);    }

动画效果:

AnimationSet 动画集合

相信大家对4个动画效果的使用有初步的了解了,那么现在你可能会问:如果我想把4是个动画效果集成在一起呢?应该如何实现? 如果你有细心观察的话,会发现我们在创建完一个 animation resource file的xml文件之后打开会发现有个 < set >标签,表示动画集合,对应 AnimationSet类,有多个动画构成。

@H_599_419@

AnimationSet类继承自Animation类,是上面四种的组合容器管理类,没有自己特有的属性,他的属性继承自Animation类。当我们对set标签使用Animation类的属性时会对该标签下的所有子控件都产生影响。譬如我们在set标签下加入duration=“1000”,子控件的duration属性会失效。

那么我们现在把刚刚学到的4个动画效果集成在一起,看看会是什么样子的。

新建一个 animation resource file 的xml文件 ,命名为 set_anim.xml,这里我给动画集合时间设置了4秒,还添加了一个开始速率较快,后面减速的插值器:
<?xml version="1.0" enCoding="utf-8"?><set xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:duration="4000"    androID:shareInterpolator="@androID:anim/decelerate_interpolator">    <!--  向下平移  -->    <translate        androID:fromXDelta="0"        androID:toXDelta="0"        androID:fromYDelta="0"        androID:toYDelta="800"/>    <!--  缩小控件  -->    <scale        androID:fromXScale="1.0"        androID:toXScale="0.0"        androID:fromYScale="1.0"        androID:toYScale="0.0"        androID:pivotX="50%"        androID:pivotY="50%"/>    <!--  旋转360度  -->    <rotate        androID:fromdegrees="0"        androID:todegrees="360"        androID:pivotX="50%"        androID:pivotY="50%"/>    <!--  逐渐透明  -->    <Alpha        androID:fromAlpha="1"        androID:toAlpha="0"/></set>
在界面中添加一个控件,用于控制动画效果:
<?xml version="1.0" enCoding="utf-8"?><linearLayout...>    <linearLayout...>    <button        androID:ID="@+ID/btnSet"        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:text="动画集合"/>    <TextVIEw        androID:ID="@+ID/tvAnimation"        androID:layout_wIDth="200dp"        androID:layout_height="50dp"        androID:background="#2196F3"        androID:gravity="center"        androID:text="动画效果" /></linearLayout>
给btnSet添加点击事件:
 @OnClick({R.ID.btnTranslation, R.ID.btnScale, R.ID.btnRotate, R.ID.btnAlpha, R.ID.btnSet})    public voID onVIEwClicked(VIEw vIEw) {        // 方法一:通过xml方式实现动画效果        Animation animation = null;        switch (vIEw.getID()) {            case R.ID.btnTranslation:                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);                break;            case R.ID.btnScale:                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);                break;            case R.ID.btnRotate:                animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);                break;            case R.ID.btnAlpha:                animation = AnimationUtils.loadAnimation(this, R.anim.Alpha_anim);                break;            case R.ID.btnSet:                animation = AnimationUtils.loadAnimation(this, R.anim.set_anim);            default:        }        tvAnimation.startAnimation(animation);        // 方法二:通过代码动态的实现动画效果//        TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);//        ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f, tvAnimation.getWIDth() / 2, tvAnimation.getHeight() / 2);//        RotateAnimation rotateAnimation = new RotateAnimation(0, 360, tvAnimation.getWIDth() / 2, tvAnimation.getHeight() / 2);//        AlphaAnimation AlphaAnimation = new AlphaAnimation(1.0f, 0.0f);//        AnimationSet animationSet = new AnimationSet(true);//        animationSet.setDuration(4000);//        animationSet.setInterpolator(new DecelerateInterpolator());//        animationSet.addAnimation(translateAnimation);//        animationSet.addAnimation(scaleAnimation);//        animationSet.addAnimation(rotateAnimation);//        animationSet.addAnimation(AlphaAnimation);//        tvAnimation.startAnimation(animationSet);    }
动画效果:

自定义view动画

系统提供的4种动画效果已经可以满足绝大部分的动画效果了,但有特殊要求,我们也是可以自定义view动画效果的。那么如何自定义view动画效果呢?我们从前面的Animation类的介绍了解到,它是一个抽象类,我们只需要继承它,并覆写它的initialize和applytransformation方法。在initialize中做初始化工作,在applytransformation中做相应的矩阵变换(需要用到Camera来简化矩阵的变化过程),需要用到数学知识。这里参考了 AndroID 的 APIdemo 中自定义view动画 Rotate3dAnimation。Rotate3dAnimation 可以围绕Y轴旋转并且同时沿着Z轴平移从而实现一种类似3D的效果。具体的代码和使用可以参考这篇文章:翻牌(翻转)动画-Rotate3dAnimation的应用

补充

在动画效果执行完成之后,并没有改变VIEw的位置。如,我左上角有一个button,我把往下平移,并保持动画结束后的状态,此时你再点击左上角button位置时,依旧能响应button的点击事件。而你点击平移后的button是没有任何反应的。

在进行动画的时候,尽量使用dp,因为px会导致适配问题。

项目代码下载地址:码云

总结

以上是内存溢出为你收集整理的我的Android开发之旅(二):Android三种动画效果的浅入之View动画全部内容,希望文章能够帮你解决我的Android开发之旅(二):Android三种动画效果的浅入之View动画所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1062244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存