29、Android基本动画

基本动画

帧动画

帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样。和补间动画一样可以通过xml实现也可以通过java代码实现。

a) 首先需要在res目录下创建drawable目录,再新建xml文件并指定播放形式和资源引用。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
                android:oneshot="false"><!--oneshot为true表示播放一次,false是重复播放 -->
    <!--duration:画面的播放时间,单位是毫秒 -->
    <item android:drawable="@mipmap/image_1" android:duration="200" />
    <item android:drawable="@mipmap/image_2" android:duration="200" />
    <item android:drawable="@mipmap/image_3" android:duration="200" />
    <item android:drawable="@mipmap/image_4" android:duration="200" />
    <item android:drawable="@mipmap/image_5" android:duration="200" />
    <item android:drawable="@mipmap/image_6" android:duration="200" />
</animation-list>

b) 在布局中创建ImageView,然后写上如下代码

public class MainActivity extends AppCompatActivity {
    private AnimationDrawable mDrawable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView = (ImageView) findViewById(R.id.iv_image);
        imageView.setBackgroundResource(R.drawable.frame_animation);
        mDrawable = (AnimationDrawable) imageView.getBackground();
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mDrawable.start();
            return true;
        }
        return super.onTouchEvent(event);
    }
}

补间动画

渐变动画

渐变动画是用来修改图片的透明度等操作,基本语法如下:

XML节点 功能说明
alpha 渐变透明度动画效果
fromalpha 属性为动画起始时透明度 0.0表示完全透明 1.0表示完全不透明 以上取值0.0-1.0之间的float数据类型的数字
toAlpha 属性为动画结束时透明度

使用代码实现渐变动画:

AlphaAnimation aa = new AlphaAnimation(0.0f, 1.0f);
// 设置播放时间
aa.setDuration(2 * 1000);
// 设置重复次数
aa.setRepeatCount(2);
// 设置倒叙播放
aa.setRepeatMode(Animation.REVERSE);
imageView.setAnimation(aa);

XML资源实现渐变动画:

<alpha
    android:fromAlpha=“0.1”
    android:toAlpha=“1.0”
    android:duration=“3000”/> 

缩放动画

缩放动画是用来修改图片的大小等操作,基本语法如下:

XML节点 功能说明
Scale 渐变尺寸伸缩动画效果
fromXScale[float] fromYScale[float] 为动画起始时,X、Y坐标上的缩伸尺寸 0.0表示收缩到没有,1.0表示正常无伸缩 值小于1.0表示收缩,值大于1.0表示放大
toXScale[float toYScale[float]] 为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float] pivotY[float] 为动画相对于物体的X、Y坐标的开始位置 属性值说明:从0%~100%中取值,50%位物体的X或Y方向坐标上的中点位置。

使用代码实现缩放动画:

ScaleAnimation sa = new ScaleAnimation(0.1f, 2.0f, 0.1f, 2.0f,
        Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
// 设置播放的时间
sa.setDuration(2 * 1000);
// 设置播放次数
sa.setRepeatCount(2);
// 设置倒叙播放
sa.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(sa);

XML资源实现缩放动画:

<scale
    android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
    android:fromXScale=”0.0″
    android:toXScale=”1.4″
    android:fromYScale=”0.0″
    android:toYScale=”1.4″
    android:pivotX=”50%”
    android:pivotY=”50%”
    android:fillAfter=”false”
    android:startOffset=“700”
    android:duration=”700″
    android:repeatCount=”10″/>

位移动画

位移动画是用来修改图片的位置等操作,基本语法如下:

XML节点 功能说明
Transtate 画面转换位置移动动画效果
fromXDeita toXDeita 为动画、结束起始时X坐标上的位置
fromYDeita toYDeita 为动画、结束起始时Y坐标上的位置

使用代码实现位移动画:

TranslateAnimation ta = new TranslateAnimation(
        Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 3.0f,
        Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 3.0f);
// 设置播放时间
ta.setDuration(2 * 1000);
// 设置播放次数
ta.setRepeatCount(2);
// 设置倒叙播放
ta.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(ta);

XML资源实现位移动画:

<translate
     android:fromXDelta=”30″
     android:toXDelta=”-80″
     android:fromYDelta=”30″
     android:toYDelta=”300″
     android:duration=”2000″ />

旋转动画

旋转动画是用来修改图片的角度等操作,基本语法如下:

XML节点 功能说明
Rotate 画面转移旋转动画效果
fromDegrees 为动画起始时物体的角度 当角度为负数---表示逆时针旋转 当角度为整数---表示顺时针旋转 (负数from---to整数:顺时针旋转) (负数from---to负数:逆时针旋转) (正数from---to正数:顺时针旋转) (正数from---to负数:逆时针旋转)
toDegrees 动画结束时物体旋转的角度可以大于360度
pivotX pivotY 为动画相对于物体的X、Y坐标的开始位 说明:以上两个属性值从0%~100%中取值 50%位物体的X或Y方向坐标上中点位置

使用代码实现旋转动画:

RotateAnimation ra = new RotateAnimation(0, 360,
        Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
// 设置播放时间
ra.setDuration(2 * 1000);
// 设置播放次数
ra.setRepeatCount(2);
// 设置的倒叙播放
ra.setRepeatMode(Animation.REVERSE);
imageView.startAnimation(ra);

XML资源实现旋转动画:

<rotate
    android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
    android:fromDegrees=”0″
    android:toDegrees=”+350″
    android:pivotX=”50%”
    android:pivotY=”50%”
    android:duration=”3000″ />

动画集合

动画集是将上述动画进行合并到一起,具体请参看代码:

AnimationSet set = new AnimationSet(false);
.
// 动画实现省略
.
// 将所有动画添加到动画集
set.addAnimation(aa);
set.addAnimation(sa);
set.addAnimation(ta);
set.addAnimation(ra);
imageView.startAnimation(set);

对于动画事件,Android也提供了对应的监听回调,要添加相应的监听方法,代码如下所示:

animation.setAnimationListener(new AnimationListener() {
    /**动画开始时回调*/
    @Override
    public void onAnimationStart(Animation animation) {
        
    }
    /**动画重播时回调*/
    @Override
    public void onAnimationRepeat(Animation animation) {
        
    }
    /**动画结束时回调*/
    @Override
    public void onAnimationEnd(Animation animation) {
        
    }
});  

实现Activity进出动画

slide_in_left.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:zAdjustment="top">
    <translate
        android:duration="300"
        android:fromXDelta="-100.0%p"
        android:toXDelta="0.0" />
</set>

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:zAdjustment="top">
    <translate
        android:duration="300"
        android:fromXDelta="100.0%p"
        android:toXDelta="0.0" />
</set>

slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:zAdjustment="top">
    <translate
        android:duration="300"
        android:fromXDelta="0.0"
        android:toXDelta="-100.0%p" />
</set>

slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false"
    android:zAdjustment="top">
    <translate
        android:duration="300"
        android:fromXDelta="0.0"
        android:toXDelta="100.0%p" />
</set>

在style.xml中AppTheme里配置Activity的动画

 <!--Activity进场。出场动画-->
<style name="AnimationActivity" parent="@android:style/Animation.Activity">
    <!--用于设置打开新的Activity并进入新的Activity展示的动画-->
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item>
    <!--用于设置打开新的Activity并销毁之前的Activity展示的动画-->
    <item name="android:activityOpenExitAnimation">@anim/slide_out_right</item>
    <!--用于设置关闭当前Activity进入上一个Activity展示的动画-->
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
    <!--用于设置关闭当前Activity时展示的动画-->
    <item name="android:activityCloseExitAnimation">@anim/slide_out_left</item>
</style>

还可以在Activity的startActivity和finish方法中进行设置:

@Override
public void startActivity(Intent intent) {
    super.startActivity(intent);
    overridePendingTransition(R.anim.slide_in_left,R.anim.slide_out_right);

}

@Override
public void finish() {
    super.finish();
    overridePendingTransition( R.anim.slide_in_right,R.anim.slide_out_left);
}

布局动画

所谓布局动画是指作用在ViewGroup上,给VewGroup增加View时添加动画过渡效果。最简单的布局动画是在ViewGroup的XML中,使用以下代码来打开布局动画:

android:animateLayoutChanges="true"  

设置该属性后,当ViewGroup添加View时,子View会呈现逐渐显示的过渡效果,这个效果是Android默认的,且无法使用自定义的动画进行替换。如果想自定义子View

的过渡效果,可以使用LayoutAnimationController类来完成相关操作。

LinearLayout ll = (LinearLayout) findViewById(R.id.ll_root);
// 设置过渡动画
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
sa.setDuration(2000);
// 设置布局动画的显示属性
LayoutAnimationController lac = new LayoutAnimationController(sa, 0.5F);
lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
// 为ViewGroup设置布局动画
ll.setLayoutAnimation(lac);  

LayoutAnimationController的第一个参数是需要作用的动画,dirge参数是每个子View显示delay时间。

当delay时间不为0时,可以设置子View显示的顺序:

LayoutAnimationController.ORDER_NORMAL    -- 顺序
LayoutAnimationController.ORDER_RANDOM    -- 随机
LayoutAnimationController.ORDER_REVERSE   -- 反序
原文地址:https://www.cnblogs.com/pengjingya/p/14952681.html