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

2018-05-23  本文已影响37人  Joe_zShare

上一节我们介绍的补间动画是以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

上一篇下一篇

猜你喜欢

热点阅读