Android补间动画

这篇文章简要介绍一些Android动画中的补间动画。补间动画有四种:旋转、透明度改变、伸缩变化、位移。具体的使用就是:在res文件夹下,新建一个anim文件夹。这个文件夹是放动画xml文件的文件夹。如何Java代码中通过 例如AnimationUtils.loadAnimation(this,R.anim.anim_alpha) 方式引入动画。还有一种用法就是直接在Java代码中通过animation的API来实例化动画。下面上代码加解析。

anim_alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<!--nterpolator 控制动画的变化速度 有以下可供选择的实现类
LinearInterpolator:动画以均匀的速度改变
AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速
AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,中间时加速
CycleInterpolator:动画循环播放特定次数,变化速度按正弦曲线改变: Math.sin(2 * mCycles * Math.PI * input)
DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速
AnticipateInterpolator:反向,先向相反方向改变一段再加速播放
AnticipateOvershootInterpolator:开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
OvershottInterpolator:回弹,最后超出目的值然后缓慢改变到目的值
这些类在Android已提供,xml文件中,在Interpolator加‘-’如@android:anim/overshoot_interpolator

fromAlpha 起始透明度(0-1:完全透明-不透明)
toAlpha 结束透明度
duration 持续时间
-->

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/overshoot_interpolator"
    android:fromAlpha="1.0"
    android:toAlpha="0.5"
    android:duration="2000"
    />

anim_rotate.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
fromDegrees 起始角度 toDegrees结束角度。结束角度如果为负值则逆时针旋转。
android:pivotX 缩放点的xy坐标。0%为X轴左边(Y轴上边),100%为X轴右边边(Y轴下边),
也可以是不在控件上的点(坐标不在0%-100%)。
坐标不是百分数时,单位为dp,参考物是控件的左边(X轴)、上边(Y轴),正方向为右(X轴)和下(Y轴)
android:repeatCount 旋转次数 0表示一次,1表示两次,类推。
android:repeatMode restart表示重复旋转,repeatCount大于0是有效。reverse表示偶数次反向旋转
-->

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/overshoot_interpolator"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="-100"
    android:pivotY="-100"
    android:repeatCount="1"
    android:repeatMode="reverse"
    android:duration="2000"
    />

anim_scale.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
android:fromXScale 沿着X轴缩放的起始比例
android:pivotX 缩放点的xy坐标。0%为X轴左边(Y轴上边),100%为X轴右边边(Y轴下边),
android:toXScale 缩放结束比例
-->
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/overshoot_interpolator"
    android:fromXScale="0.5"
    android:fromYScale="0.5"
    android:pivotX="0%"
    android:pivotY="0%"
    android:toXScale="1.5"
    android:toYScale="1.5"
    android:duration="2000"
    />

anim_translate.xml

<?xml version="1.0" encoding="utf-8"?>
<!--它属性的参照物是控件本身(X轴为控件坐标,Y轴位控件上边)
正数表示控件右边(下边),参数如果是非百分数则是dp为单位,如果是百分数则是以自身长宽为单位。
android:fromXDelta X轴起始位置
android:toYDeltaY轴结束位置
android:fromXDelta="1"距控件左边1dp正方向的位置开始移动
android:toXDelta="100%" 移动到与控件距离为整个控件长度的地方
android:toXDelta="100%p" 移动到与控件距离为整个父View长度的地方
-->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/overshoot_interpolator"
    android:fromXDelta="10"
    android:fromYDelta="0"
    android:toXDelta="100%"
    android:toYDelta="0"
    android:duration="2000"
    />
主活动:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    Button rotate;
    Button alpha;
    Button scale;
    Button translate;
    TextView textView;
    Animation animation;

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

        initview();
    }

    public void initview(){
        rotate= (Button) findViewById(R.id.button1);
        alpha= (Button) findViewById(R.id.button2);
        scale= (Button) findViewById(R.id.button3);
        translate= (Button) findViewById(R.id.button4);
        textView= (TextView) findViewById(R.id.textview);

        rotate.setOnClickListener(this);
        alpha.setOnClickListener(this);
        scale.setOnClickListener(this);
        translate.setOnClickListener(this);
    }

    public void animatonlisten(){
        //动画的监听
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //动画开始时调用
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Toast.makeText(MainActivity.this,"动画结束",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                //动画重复执行时调用
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.button1:
                //javacode方式
                animation=new RotateAnimation(0,360,-100,-100);
                animation.setDuration(2000);
                animation.setFillAfter(true);
                //xml方式
                //animation= AnimationUtils.loadAnimation(this,R.anim.anim_rotate);
                textView.startAnimation(animation);

                animatonlisten();
                break;
            case R.id.button2:
                //javacode方式
                animation=new AlphaAnimation((float) 1.0,(float) 0.5);
                animation.setDuration(2000);
                //xml方式
                //animation= AnimationUtils.loadAnimation(this,R.anim.anim_alpha);
                textView.startAnimation(animation);
                animatonlisten();
                break;
            case R.id.button3:
                //javacode
                animation=new ScaleAnimation((float) 0.5,(float) 1.5,(float) 0.5,(float) 1.5);
                animation.setDuration(2000);
                //xml方式
                //animation= AnimationUtils.loadAnimation(this,R.anim.anim_scale);
                textView.startAnimation(animation);
                animatonlisten();
                break;
            case R.id.button4:
                //javacode
                animation=new TranslateAnimation(0,100,0,100);
                animation.setDuration(2000);

                //xml方式
                //animation= AnimationUtils.loadAnimation(this,R.anim.anim_translate);
                textView.startAnimation(animation);
                animatonlisten();
                break;
        }
    }
}
上述代码应用了xml和Javacode方式来使用补间动画,然后还实现了动画的监听。运行之后你会发现一个问题,执行动画效果的控件,在执行完动画效果后又回到了原来的位置。那么如何让它停在动画结束的位置呢?只需要一行代码: animation.setFillAfter( true)给animation设置这个属性后,就可以了。
但是补间动画有一个最大的缺陷,执行动画的控件只是表层执行了动画或者说就是绘制了动画而已,其在布局中实际的位置并没有变。例如:我将一个按钮从底部移动到顶部,然后我点击顶部的按钮不会触发按钮的事件,而点击底部按钮本来的位置会触发点击事件。那么如何让控件也跟着移动呢?这就要用到属性动画了。

关于补间动画的更多知识,请查阅文档 http://www.android-doc.com/reference/android/view/animation/Animation.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值