Android动画

        这篇博客主要总结一下自己在项目中对动画的一些使用。我写博客,其实更多的是总结自己在工作中用到的一些知识。比如某一段时间一个知识点相关的技术用的比较多,那我会总结一下。其实,对于Android动画的总结,这是几个月前就应该写完的一篇博客,然而那段时间工作实在是太忙了,没有及时去总结。于是,今天把这篇博客提上来,总结一下Android中动画的一些使用。

一、前言

        在总结动画的使用前,我们先想想为我们的app添加动画的目的是什么?毫无疑问,为APP添加动画,会使我们的app界面更加美丽,效果更加华丽,这样也能吸引更多的用户使用我们的app。就好比自己的亲儿子或者亲闺女,我们总想把她(他)打扮的漂亮点。但是,是不是动画一定是好的呢?或者说,动画越多越好吗?当然也不是,其实在我们的app中添加动画,也会带来一些问题,最主要的就是耗电量增加。毫无疑问,华丽的动画效果会带来大量的电量消耗。因此,并不是说app都应该添加很多绚丽的动画,而应适度的添加。

二、动画

        这个小节,按照分类大体总结一下Android常用动画的基本使用方法。作为Android开发,或者正在学习Android的朋友,大家对于Android动画的分类肯定不陌生。Android动画包括补间动画,帧动画,属性动画。

1、补间动画

        首先,简单说一下什么是补间动画。补间动画是使一个物体由一个状态转变为另一种状态的动画。通俗来讲,定义一个补间动画,我们只需要给定物体的初始属性和终止属性,而中间的变化过程由补间动画自己实现。那么,这些状态包括什么呢?相信大家都知道,包括旋转,缩放,位置,透明度。

        我们看一下补间动画的几个子类:AlphaAnimation,RotateAnimation,ScaleAnimation,TranslateAnimation,分别对应透明度动画,旋转动画,缩放动画,平移动画。此外,还包括AnimationSet,这是Android提供的把多个补间动画组合为一个动画的机制,我们后面会讲。如下图所示:

(1)AlphaAnimation

        AlphaAnimation是控制物体透明度变化的动画,它的使用很简单,我们简单看一下AlphaAnimation的部分源码,如下所示。使用AlphaAnimation,可以使用Java代码,也可以使用xml代码,我们只看Java中使用的构造函数。需要两个变量:fromAlpha和toAlpha,也就是初始的alpha值和终止的alpha值。通过注释,我们可以看到alpha值的范围是0.0-1.0。

public class AlphaAnimation extends Animation {
    private float mFromAlpha;
    private float mToAlpha;
    
    /**
     * Constructor to use when building an AlphaAnimation from code
     * 
     * @param fromAlpha Starting alpha value for the animation, where 1.0 means
     *        fully opaque and 0.0 means fully transparent.
     * @param toAlpha Ending alpha value for the animation.
     */
    public AlphaAnimation(float fromAlpha, float toAlpha) {
        mFromAlpha = fromAlpha;
        mToAlpha = toAlpha;
    }
}

        看过上面的构造函数,我们也尝试着去写一个简单的AlphaAnimation,动画有很多属性我们可以设置,例如时间,重复次数,重复模式等,我们在这里只设置一个持续时间:

    private void initAlpha(){
        alphaAnimation = new AlphaAnimation(1.0f,0.2f);
        alphaAnimation.setDuration(2000);
        imageView.startAnimation(alphaAnimation);
    }

(2)ScaleAnimation

        缩放动画是对物体进行缩放的补间动画,我们看一下ScaleAnimation的源码,看一下其构造函数。可以看到,比透明度动画的参数要多。不难理解,因为缩放涉及到x方向和y方向,因此需要传入四个值:

    public ScaleAnimation(float fromX, float toX, float fromY, float toY) {
        mResources = null;
        mFromX = fromX;
        mToX = toX;
        mFromY = fromY;
        mToY = toY;
        mPivotX = 0;
        mPivotY = 0;
    }

        我们尝试实现一个简单的缩放动画:

private void initScale(){
        animation = new ScaleAnimation(1.0f,0.5f,1.0f,0.5f);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }

(3)TranslateAnimation

        TranslateAnimation是实现物体平移的动画,我们还是简单看一下其构造函数,也是四个值。因为涉及到x和y两个方向的平移:

private void initTrans(){
        animation = new TranslateAnimation(0,180,0,360);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }

        下面,我们实现一个简单的平移动画:

    private void initTrans(){
        animation = new TranslateAnimation(0,180,0,360);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }

 (4)RotateAnimation

        RotateAnimation是控制物体旋转的动画。我们都知道,旋转一个物体,需要有一个参考点。

  • RotateAnimation(float, float):

        让物体围绕(0,0)从一个角度旋转到另一个角度。这里的(0, 0)其实就是物体的左上角,构造参数如下:

public RotateAnimation(float fromDegrees, float toDegrees) {
        mFromDegrees = fromDegrees;
        mToDegrees = toDegrees;
        mPivotX = 0.0f;
        mPivotY = 0.0f;
    }

        我们实现一个这样的旋转动画,也就是让物体围绕自己的左上角顶点旋转:

private void initRotate(){
        animation = new RotateAnimation(0,360);
        animation.setDuration(2000);
        imageView.startAnimation(animation);
    }
  • RotateAnimation(float, float, float, float):

        除了传入初始的角度和终止的角度外,还传入了一对坐标,也就是旋转参考点的坐标:

  •     public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) {
            mFromDegrees = fromDegrees;
            mToDegrees = toDegrees;
    
            mPivotXType = ABSOLUTE;
            mPivotYType = ABSOLUTE;
            mPivotXValue = pivotX;
            mPivotYValue = pivotY;
            initializePivotPoint();
        }

    我们实现一个让物体围绕自己的中心点旋转的动画:

  • private void initRotate(){
            animation = new RotateAnimation(0,360,imageView.getWidth()/2,imageView.getHeight()/2);
            animation.setDuration(2000);
            imageView.startAnimation(animation);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个玩游戏的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值