Android 逐帧和补间动画

一、逐帧动画

从字面上理解,就是一帧挨着一帧播放图片,有点类型电影。可以用xml代码或者java代码实现。
1、xml代码实现

<animation-list
    android:oneshot="false"
 xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@mipmap/image1"
        android:duration="100">item>
    <item
        android:drawable="@mipmap/image2"
        android:duration="100">item>
    <item
        android:drawable="@mipmap/image3"
        android:duration="100">item>
    <item
        android:drawable="@mipmap/image4"
        android:duration="100">item>
animation-list>
<ImageView
    android:id="@+id/xml"
    android:layout_width="130dp"
    android:layout_height="70dp"
    android:src="@drawable/bird_animlist"/>
private void xmlData(){
    xml.setImageResource(R.drawable.bird_animlist);
    final AnimationDrawable xmlDraw = (AnimationDrawable) xml.getDrawable();
    findViewById(R.id.btn_xml).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {          
    Log.d("hp","xmlDraw.isStateful():"+xmlDraw.isStateful());
    Log.d("hp","xmlDraw.isRunning():"+xmlDraw.isRunning());
    if (xmlDraw.isRunning()){
        xmlDraw.stop();
    } else {
        xmlDraw.start();
    }
  }
});
}

2、java代码实现:

private void javaData()
{
    final AnimationDrawable javaDraw = new AnimationDrawable();
    for (int i = 0; i < 4; i++) {
        int id = getResources().getIdentifier("image"+(i+1),"mipmap",getPackageName());
        Drawable draw = getResources().getDrawable(id);
        javaDraw.addFrame(draw,50);
    }
    javaDraw.setOneShot(false);
    java.setImageDrawable(javaDraw);
    findViewById(R.id.btn_java).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (javaDraw.isRunning())
            {
                javaDraw.stop();
            }
            else
            {
                javaDraw.start();
            }
        }
    });
}

二、补间动画

1、Scale 缩放
1)xml代码实现

<scale
    android:fromXScale="0"
    android:toXScale="1.5"
    android:fromYScale="0"
    android:toYScale="1.5"
    android:duration="1000"
    android:pivotX="0"
    android:pivotY="0"
    android:fillAfter="true"
    android:repeatCount="5"
    android:repeatMode="reverse"
    android:toXDelta ="0"
    android:toYDelta ="0"
    android:interpolator="@android:anim/linear_interpolator"
    xmlns:android="http://schemas.android.com/apk/res/android">
scale>
/**
 * 缩放xml
 * @author hjy
 * created at 2017/3/25 14:41
 */
private void doScale_xml()
{
    ScaleAnimation sa = (ScaleAnimation) AnimationUtils.loadAnimation(TweenActivity.this,R.anim.scale);
    tween_scale_xml.startAnimation(sa);
}

2)java代码实现

/**
 * 缩放java
 * @author hjy
 * created at 2017/3/25 14:41
 */
private void doScale_java()
{
    sA.setDuration(1000);
    sA.setFillAfter(true);
    sA.setRepeatCount(10);
    sA.setInterpolator(this,android.R.anim.linear_interpolator);
    sA.setRepeatMode(Animation.RESTART);
    tween_scale_java.startAnimation(sA);
}

3)函数介绍
fromXDelta,fromYDelta
起始时X,Y座标,屏幕右下角的座标是X:320,Y:480
toXDelta, toYDelta
动画结束时X,Y的座标
interpolator 指定动画插入器
fromXScale,fromYScale
动画开始前X,Y的缩放,0.0为不显示, 1.0为正常大小
toXScale,toYScale
动画最终缩放的倍数, 1.0为正常大小,大于1.0放大
pivotX, pivotY
动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从自身中间开始
startOffset
动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒
duration
一次动画效果消耗的时间,单位毫秒,值越小动画速度越快
repeatCount
动画重复的计数,动画将会执行该值+1次
repeatMode
动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。
restart 为重新执行,方向不变
2、Rotate旋转
1)xml代码实现

<rotate
    android:toDegrees="0"
    android:fromDegrees="-360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="2000"
    android:fillAfter="true"
    android:repeatMode="reverse"
    android:repeatCount="100"
    android:interpolator="@android:anim/linear_interpolator"
    xmlns:android="http://schemas.android.com/apk/res/android">
rotate>
/**
 * 旋转xml
 * @author hjy
 * created at 2017/3/25 14:41
 */
private void doRotate_xml()
{
    RotateAnimation ra = (RotateAnimation) AnimationUtils.loadAnimation(TweenActivity.this,R.anim.rotate);
    tween_rotate_xml.startAnimation(ra);
}

2)java代码实现

/**
 * 旋转java
 * @author hjy
 * created at 2017/3/25 14:41
 */
private void doRotate_java()
{
    rA.setDuration(1000);
    rA.setFillAfter(true);
    rA.setRepeatCount(20);
    rA.setInterpolator(this,android.R.anim.linear_interpolator);
    rA.setRepeatMode(Animation.REVERSE);
    tween_rotate_java.startAnimation(rA);
}

3)函数介绍
fromDegrees 动画开始时的角度
toDegrees 动画结束时物件的旋转角度,正代表顺时针
pivotX 属性为动画相对于物件的X坐标的开始位置
pivotY 属性为动画相对于物件的Y坐标的开始位置

3、translate位移
1)xml代码实现

<translate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="100"
    android:toYDelta="100"
    android:duration="500"
    android:repeatCount="10"
 android:interpolator="@android:anim/accelerate_interpolator">
translate>
/**
 * 平移xml
 * @author hjy
 * created at 2017/3/25 11:55
 */
private void doTranslate_xml()
{
    TranslateAnimation tA_xml = (TranslateAnimation) AnimationUtils.loadAnimation(TweenActivity.this,R.anim.translation);
    tween_cat_xml.startAnimation(tA_xml);
}

2)java代码实现
类似以上代码。
3)函数介绍
fromXDelta,fromYDelta
起始时X,Y座标,屏幕右下角的座标是X:320,Y:480
toXDelta, toYDelta
动画结束时X,Y的座标
4、alpha透明度
1)xml代码实现

<alpha   xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="1"
    android:toAlpha="0"
    android:duration ="5000"
    android:fillAfter = "true"
    android:repeatCount="10"
    android:repeatMode="reverse">
alpha>
/**
 * 透明度xml
 * @author hjy
 * created at 2017/3/25 14:35
 */
private void doAlpha_xml()
{
    AlphaAnimation aa = (AlphaAnimation) AnimationUtils.loadAnimation(TweenActivity.this,R.anim.alpha);
    tween_alpha_xml.startAnimation(aa);
}

2)java代码实现

/**
 * 透明度java
 * @author hjy
 * created at 2017/3/25 14:34
 */
private void doAlpha_java()
{
    aA.setRepeatCount(10);
    aA.setFillAfter(true);
 aA.setInterpolator(this,android.R.anim.accelerate_decelerate_interpolator);
    aA.setRepeatMode(Animation.REVERSE);
    aA.setDuration(5000);
    tween_alpha_java.startAnimation(aA);
}

3)函数介绍
fromAlpha:开始时透明度
toAlpha: 结束时透明度
duration:动画持续时间
fillAfter:设置动画结束后保持当前的位置

4、set动画组合使用
这里就详细介绍了…

你可能感兴趣的:(Android,基础,android动画)