Android 动画的实现

来源:互联网 发布:visual c 数据库开发 编辑:程序博客网 时间:2024/05/20 11:24

第一种,在通过xml资源文件实现动画效果

在项目的res文件下新建anim文件夹,在anim文件夹下新建文件anim_demo,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <!--
    透明度控制动画效果 alpha
        浮点型值:
            fromAlpha 属性为动画起始时透明度
            toAlpha   属性为动画结束时透明度
            说明:
                0.0表示完全透明
                1.0表示完全不透明
           以上值取0.0-1.0之间的float数据类型的数字
        长整型值:
          duration  属性为动画持续时间
            说明:
                时间以毫秒为单位
    -->

    <alpha
        android:duration="3000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />



    <!--
      尺寸伸缩动画效果 scale
        属性:interpolator 指定一个动画的插入器
        在我试验过程中,使用android.res.anim中的资源时候发现
        有三种动画插入器:
            accelerate_decelerate_interpolator  加速-减速 动画插入器
            accelerate_interpolator        加速-动画插入器
            decelerate_interpolator        减速- 动画插入器
        其他的属于特定的动画效果
      浮点型值:
            fromXScale 属性为动画起始时 X坐标上的伸缩尺寸
             toXScale   属性为动画结束时 X坐标上的伸缩尺寸
             fromYScale 属性为动画起始时Y坐标上的伸缩尺寸
             toYScale   属性为动画结束时Y坐标上的伸缩尺寸
            说明:
                  以上四种属性值
                    0.0表示收缩到没有
                    1.0表示正常无伸缩
                    值小于1.0表示收缩
                    值大于1.0表示放大
            pivotX     属性为动画相对于物件的X坐标的开始位置
            pivotY     属性为动画相对于物件的Y坐标的开始位置
            说明:
                    以上两个属性值 从0%-100%中取值
                    50%为物件的X或Y方向坐标上的中点位置
        长整型值:
            duration  属性为动画持续时间
            说明:   时间以毫秒为单位
        布尔型值:
            fillAfter 属性 当设置为true ,该动画转化在动画结束后被应用
        -->


    <scale
        android:duration="3000"
        android:fillAfter="false"
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.4"
        android:toYScale="1.4" />


    <!--
        translate 位置转移动画效果
            整型值:
                fromXDelta 属性为动画起始时 X坐标上的位置
                toXDelta   属性为动画结束时 X坐标上的位置
                fromYDelta 属性为动画起始时 Y坐标上的位置
                toYDelta   属性为动画结束时 Y坐标上的位置
                注意:
                         没有指定fromXType toXType fromYType toYType 时候,
                         默认是以自己为相对参照物
            长整型值:
                duration  属性为动画持续时间
                说明:   时间以毫秒为单位
        -->


    <translate
        android:duration="3000"
        android:fromXDelta="30"
        android:fromYDelta="30"
        android:toXDelta="-80"
        android:toYDelta="300" />


    <!--
      rotate 旋转动画效果
        属性:interpolator 指定一个动画的插入器
              在我试验过程中,使用android.res.anim中的资源时候发现
              有三种动画插入器:
                accelerate_decelerate_interpolator   加速-减速 动画插入器
                accelerate_interpolator               加速-动画插入器
                decelerate_interpolator               减速- 动画插入器
              其他的属于特定的动画效果
        浮点数型值:
            fromDegrees 属性为动画起始时物件的角度
            toDegrees   属性为动画结束时物件旋转的角度 可以大于360度
            说明:
                      当角度为负数——表示逆时针旋转
                      当角度为正数——表示顺时针旋转
                      (负数from——to正数:顺时针旋转)
                    (负数from——to负数:逆时针旋转)
                    (正数from——to正数:顺时针旋转)
                      (正数from——to负数:逆时针旋转)
            pivotX     属性为动画相对于物件的X坐标的开始位置
            pivotY     属性为动画相对于物件的Y坐标的开始位置

            说明:        

以上两个属性值 从0%-100%中取值

                        50%为物件的X或Y方向坐标上的中点位置

        长整型值:
            duration  属性为动画持续时间
            说明:       时间以毫秒为单位
    -->


    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="+350" />

</set>


然后在代码中加载动画,具体的代码实现是:


Animation animation = AnimationUtils.loadAnimation(TestActivity.this, R.anim.anim_demo);

        imageview.startAnimation(animation);

animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                
            }


            @Override
            public void onAnimationEnd(Animation animation) {


            }


            @Override
            public void onAnimationRepeat(Animation animation) {


            }
        });


第二种在代码中直接设置动画:

private void commonImageAnim() {
        ObjectAnimator animatorX = ObjectAnimator.ofFloat(imageview, "scaleX", 1.0f, 1.8f);//X轴,横向的伸缩
        animatorX.setRepeatCount(3);//设置循环的次数(不包含第一次)
        ObjectAnimator animatorY = ObjectAnimator.ofFloat(imageview, "scaleY", 1.0f, 1.8f);//Y轴,纵向的伸缩
        animatorY.setRepeatCount(3);//设置循环的次数(不包含第一次)


        ObjectAnimator rotation = ObjectAnimator.ofFloat(imageview, "rotation", 0, 360f);//旋转动画
        rotation.setRepeatCount(3);//设置循环的次数(不包含第一次)


        ObjectAnimator alpha = ObjectAnimator.ofFloat(imageview, "alpha", 0, 1.0f);//隐藏动画
        alpha.setRepeatCount(3);//设置循环的次数(不包含第一次)


        ObjectAnimator translateX = ObjectAnimator.ofFloat(imageview, "translationX", 0, 100f);//X轴,横向偏移(相对于控件本身的位置进行偏移)
        translateX.setRepeatCount(3);//设置循环的次数(不包含第一次)


        ObjectAnimator translateY = ObjectAnimator.ofFloat(imageview, "translationY", 0, 100f);//Y轴,纵向偏移(相对于控件本身的位置进行偏移)
        translateY.setRepeatCount(3);//设置循环的次数(不包含第一次)


        AnimatorSet set = new AnimatorSet();
        set.setDuration(3000);//动画持续的时间
        set.playTogether(animatorX, animatorY, rotation, alpha, translateX, translateY);
        set.setInterpolator(new SpringScaleInterpolator(0.2f));//通过改变构造函数参数来确定动画的震荡快慢
        set.start();


        //添加监听事件
        set.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                //动画开始的时候调用
            }


            @Override
            public void onAnimationEnd(Animator animation) {
                //画结束的时候调用
            }


            @Override
            public void onAnimationCancel(Animator animation) {
                //动画被取消的时候调用
            }


            @Override
            public void onAnimationRepeat(Animator animation) {
                //动画重复执行的时候调用


            }
        });


    }












原创粉丝点击