美文网首页
安卓动画基础02_Java代码实现

安卓动画基础02_Java代码实现

作者: Joe_zShare | 来源:发表于2018-05-23 10:09 被阅读37次

    上一节我们介绍的补间动画是以xml的形式实现的,现在我们用Java代码的方式实现。

    渐变对应的类 (AlphaAnimation)

        //构造方法
        public AlphaAnimation(float fromAlpha, float toAlpha) {
            mFromAlpha = fromAlpha;
            mToAlpha = toAlpha;
        }
    
    

    在点击事件之后,我们不再调用引入xml动画方式来加载动画,而是通过下来的Java代码来实现渐变动画。

    //实例化渐变动画
    AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
    //变化时间
    alphaAnimation.setDuration(3000);
    //保持动画之后的状态
     alphaAnimation.setFillAfter(true);
    //设置动画的重复模式:反转REVERSE和重新开始RESTART
    alphaAnimation.setRepeatMode(AlphaAnimation.RESTART);
    //设置动画播放次数
    alphaAnimation.setRepeatCount(1);
     //设置监听
    alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {
    
                        }
    
                        @Override
                        public void onAnimationEnd(Animation animation) {
    
                        }
    
                        @Override
                        public void onAnimationRepeat(Animation animation) {
    
                        }
                    });
    //清除动画
     viewDemo.clearAnimation();
    //给View设置动画
    viewDemo.setAnimation(alphaAnimation);
    //开始动画,不调用好像也可以开始
    alphaAnimation.start();
    

    最后的效果:渐变从设置的0.0f到1.0f,持续3秒,动画执行一次,保持最好状态


    渐变动画

    平移对应的类 (TranslateAnimation)

    我们先来看看几个构造方法

        public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
            mFromXValue = fromXDelta;
            mToXValue = toXDelta;
            mFromYValue = fromYDelta;
            mToYValue = toYDelta;
    
            mFromXType = ABSOLUTE;
            mToXType = ABSOLUTE;
            mFromYType = ABSOLUTE;
            mToYType = ABSOLUTE;
        }
    
        public TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
                int fromYType, float fromYValue, int toYType, float toYValue) {
    
            mFromXValue = fromXValue;
            mToXValue = toXValue;
            mFromYValue = fromYValue;
            mToYValue = toYValue;
    
            mFromXType = fromXType;
            mToXType = toXType;
            mFromYType = fromYType;
            mToYType = toYType;
        }
    

    fromXType:动画开始前的X坐标类型。取值范围为ABSOLUTE(绝对位置)、RELATIVE_TO_SELF(以自身宽或高为参考)、RELATIVE_TO_PARENT(以父控件宽或高为参考)。
    fromXValue:动画开始前的X坐标值。当对应的Type为ABSOLUTE时,表示绝对位置;否则表示相对位置,1.0表示100%。
    toXType:动画结束后的X坐标类型。
    toXValue:动画结束后的X坐标值。
    fromYType:动画开始前的Y坐标类型。
    fromYValue:动画开始前的Y坐标值。
    toYType:动画结束后的Y坐标类型。
    toYValue:动画结束后的Y坐标值。

    如果使用第一个构造方法,默认的坐标类型是ABSOLUTE(绝对位置),看下来的Java代码和运行效果

    //实例化平移动画
    TranslateAnimation translateAnimation = new TranslateAnimation(0.0f, 200.0f, 0.0f, 200.0f);
    //变化时间
    translateAnimation.setDuration(3000);
    //保持动画之后的状态
     translateAnimation.setFillAfter(true);
    //设置动画的重复模式:反转REVERSE和重新开始RESTART
    translateAnimation.setRepeatMode(AlphaAnimation.RESTART);
    //设置动画播放次数
    translateAnimation.setRepeatCount(0);
     //设置监听
    translateAnimation.setAnimationListener(new Animation.AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {
    
                        }
    
                        @Override
                        public void onAnimationEnd(Animation animation) {
    
                        }
    
                        @Override
                        public void onAnimationRepeat(Animation animation) {
    
                        }
                    });
    //清除动画
     viewDemo.clearAnimation();
    //给View设置动画
    viewDemo.setAnimation(translateAnimation);
    translateAnimation.start();
    
    平移动画1

    下面我们设置以父元素为50%也就是0.5的情况,横向偏移,只需要调用另外一个构造方法即可,设置偏移类型为相对父元素的 Animation.RELATIVE_TO_PARENT

    TranslateAnimation translateAnimation = new TranslateAnimation(
                            Animation.RELATIVE_TO_PARENT, 0.0f,
                            Animation.RELATIVE_TO_PARENT, 0.5f,
                            Animation.RELATIVE_TO_PARENT, 0.0f,
                            Animation.RELATIVE_TO_PARENT, 0.0f
                    );
    
    平移动画2

    缩放对应的类 (ScaleAnimation)

    和上面的动画类,相似,也有几个构造方法,直接看下面代码,默认相对于左上角xy的初始化位置0坐标的位置进行缩放。

    //实例化缩放动画
    ScaleAnimation scaleAnimation = new ScaleAnimation(
                            0.0f,
                            1.0f,
                            0.0f,
                            1.0f
                    );
    //变化时间
    scaleAnimation.setDuration(3000);
    //保持动画之后的状态
     scaleAnimation.setFillAfter(true);
    //设置动画的重复模式:反转REVERSE和重新开始RESTART
    scaleAnimation.setRepeatMode(AlphaAnimation.RESTART);
    //设置动画播放次数
    scaleAnimation.setRepeatCount(0);
    //清除动画
     viewDemo.clearAnimation();
    //给View设置动画
    viewDemo.setAnimation(scaleAnimation);
    scaleAnimation.start();
    
    缩放动画

    如果想相对于自身的或者父布局为基准,可以设置 pivotYType 默认是 ABSOLUTE,对应的构造方法如下

        public ScaleAnimation(float fromX, float toX, float fromY, float toY,
                int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
            mResources = null;
            mFromX = fromX;
            mToX = toX;
            mFromY = fromY;
            mToY = toY;
    
            mPivotXValue = pivotXValue;
            mPivotXType = pivotXType;
            mPivotYValue = pivotYValue;
            mPivotYType = pivotYType;
            initializePivotPoint();
        }
    
    

    我们设置一下相对于自己中心点来进行一个缩放效果显示

    ScaleAnimation scaleAnimation = new ScaleAnimation(
                            0.0f,
                            1.0f,
                            0.0f,
                            1.0f,
                            Animation.RELATIVE_TO_SELF, //相对于自己
                            0.5f, 
                            Animation.RELATIVE_TO_SELF,//相对于自己
                            0.5f
                    );
    

    旋转对应的类 (ScaleAnimation)

        /**
         * Constructor to use when building a RotateAnimation from code
         * 
         * @param fromDegrees Rotation offset to apply at the start of the
         *        animation.
         * 
         * @param toDegrees Rotation offset to apply at the end of the animation.
         * 
         * @param pivotXType Specifies how pivotXValue should be interpreted. One of
         *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
         *        Animation.RELATIVE_TO_PARENT.
         * @param pivotXValue The X coordinate of the point about which the object
         *        is being rotated, specified as an absolute number where 0 is the
         *        left edge. This value can either be an absolute number if
         *        pivotXType is ABSOLUTE, or a percentage (where 1.0 is 100%)
         *        otherwise.
         * @param pivotYType Specifies how pivotYValue should be interpreted. One of
         *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
         *        Animation.RELATIVE_TO_PARENT.
         * @param pivotYValue The Y coordinate of the point about which the object
         *        is being rotated, specified as an absolute number where 0 is the
         *        top edge. This value can either be an absolute number if
         *        pivotYType is ABSOLUTE, or a percentage (where 1.0 is 100%)
         *        otherwise.
         */
        public RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
                int pivotYType, float pivotYValue) {
            mFromDegrees = fromDegrees;
            mToDegrees = toDegrees;
    
            mPivotXValue = pivotXValue;
            mPivotXType = pivotXType;
            mPivotYValue = pivotYValue;
            mPivotYType = pivotYType;
            initializePivotPoint();
        }
    

    我们可以看之前XML设置的属性来对应上面的参数进行设置,一个相对于自己中心点旋转180度的效果。

    android:fromDegrees 旋转的起始点(旋转开始的角度)
    android:toDegrees 旋转的结束点(旋转最终角度)
    andoird:pivotX 旋转点的X值(距离左侧的偏移量)
    android:pivotY旋转点的Y值(距离顶部的偏移量)

    //对应的初始化构造方法
    RotateAnimation rotateAnimation = new RotateAnimation(
                            0.0f,
                            180.0f,
                            Animation.RELATIVE_TO_SELF,
                            0.5f,
                            Animation.RELATIVE_TO_SELF,
                            0.5f
                    );
                    //变化时间
                    rotateAnimation.setDuration(3000);
                    //保持动画之后的状态
                    rotateAnimation.setFillAfter(true);
                    //设置动画的重复模式:反转REVERSE和重新开始RESTART
                    rotateAnimation.setRepeatMode(AlphaAnimation.RESTART);
                    //设置动画播放次数
                    rotateAnimation.setRepeatCount(0);
                    //清除动画
                    viewDemo.clearAnimation();
                    //给View设置动画
                    viewDemo.setAnimation(rotateAnimation);
                    rotateAnimation.start();
    
    旋转动画

    多个动画的组合运用(AnimationSet)

    我们新建两个动画,一个是旋转动画,一个是缩放动画

    /*
    *  创建一个AnimationSet,它能够同时执行多个动画效果
    *  构造方法的入参如果是“true”,则代表使用默认的interpolator,
    *  如果是“false”则代表使用自定义interpolator
    */
    AnimationSet animationSet = new AnimationSet(true);
    
    RotateAnimation rotateAnimation = new RotateAnimation(
                            0.0f,
                            180.0f,
                            Animation.RELATIVE_TO_SELF,
                            0.5f,
                            Animation.RELATIVE_TO_SELF,
                            0.5f
                    );
    ScaleAnimation scaleAnimation = new ScaleAnimation(
                            0.0f,
                            1.0f,
                            0.0f,
                            1.0f,
                            Animation.RELATIVE_TO_SELF,
                            0.5f,
                            Animation.RELATIVE_TO_SELF,
                            0.5f
                    );
    

    然后添加到AnimationSet

                    animationSet.addAnimation(rotateAnimation);
                    animationSet.addAnimation(scaleAnimation);
                    animationSet.setFillAfter(true);
                    animationSet.setDuration(3000);
                    animationSet.setRepeatMode(AlphaAnimation.RESTART);
                    animationSet.setRepeatCount(0);
                    viewDemo.startAnimation(animationSet);
    
    组合动画

    我们看到,几个动画的类应用基本都是一样的。所以不多举例了,我们应用这些基本动画就可以设置到我们需要的动画啦。这部分就先写到这吧。

    源码地址 https://github.com/anjiao/Animation

    相关文章

      网友评论

          本文标题:安卓动画基础02_Java代码实现

          本文链接:https://www.haomeiwen.com/subject/njfkjftx.html