浅谈Android中动画的使用

本文简要介绍了Android动画的三大类别:补间动画、帧动画和属性动画。补间动画用于视图平移、旋转等效果,但实际不改变view属性;帧动画类似幻灯片,可能引发OOM;属性动画更灵活,支持任意对象,包括ObjectAnimation和ValueAnimation。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章只是对Android中的动画做一个简单的介绍
Android中的动画重要分为两类:视图动画(View Animation)和属性动画(Property Animation)
其中View Animation又分为补间动画(Tween Animation)和帧动画(Frame Animation、Drawable Animation)
Property Animation中有两种比较重要的类ObjectAnimation和ValueAnimation
比较重要的概念有插值器Interpolator和估值器TypeEvaluator
插值器:设置属性值的变化趋势
估值器:设置属性值的具体变化值

视图动画只能由view使用,有一定的局限性,属性动画可以是任意对象调用

下面来简单看下用法

1、补间动画

补间动画就是对view执行平移、翻转、透明度、缩放动画效果的
需要注意的是,仅仅是改变了view的位置,view的属性还是保持原状,比如点击事件还是在原来的位置生效
有两种设置方法,我们这里一般是在xml中配置
在res/anim文件夹下新建xml文件

<?xml version="1.0" encoding="utf-8"?>
<!--interpolator:差值器,表示动画运行时的时间正常方式,fillAfter:表示动画停留在最后运动的结果-->
    <!--java类	                            xml id值	                                               描述-->
    <!--AccelerateDecelerateInterpolator	@android:anim/accelerate_decelerate_interpolator	动画始末速率较慢,中间加速-->
    <!--AccelerateInterpolator	            @android:anim/accelerate_interpolator	            动画开始速率较慢,之后慢慢加速-->
    <!--AnticipateInterpolator	            @android:anim/anticipate_interpolator	            开始的时候从后向前甩-->
    <!--AnticipateOvershootInterpolator	    @android:anim/anticipate_overshoot_interpolator	    类似上面AnticipateInterpolator-->
    <!--BounceInterpolator	                @android:anim/bounce_interpolator	                动画结束时弹起-->
    <!--CycleInterpolator	                @android:anim/cycle_interpolator	                循环播放速率改变为正弦曲线-->
    <!--DecelerateInterpolator	            @android:anim/decelerate_interpolator	            动画开始快然后慢-->
    <!--LinearInterpolator	                @android:anim/linear_interpolator	                动画匀速改变-->
    <!--OvershootInterpolator	            @android:anim/overshoot_interpolator	            向前弹出一定值之后回到原来位置-->
    <!--PathInterpolator	 	                                                                新增,定义路径坐标后按照路径坐标来跑。-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:interpolator="@android:anim/cycle_interpolator">
    <!--透明度标签:表示透明0到不透明1之间的变换-->
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>
    <!--旋转标签:fromDegrees:表示旋转角度的起始角度,toDegrees:结束角度。pivotX:表示旋转的X轴坐标;pivotY:表示旋转的Y轴坐标-->
    <rotate
        android:fromDegrees="0.0"
        android:toDegrees="720"
        android:pivotX="50%"
        android:pivotY="50%"/>
    <!--缩放标签:fromXScale,toXScale表示水平缩放的起始值和结束值;fromYScale,toYScale竖直方向的缩放起始值和结束值。
    pivotX,pivotY,表示缩放动画效果的基准点x,y轴
    -->
    <scale
        android:fromXScale="0.4"
        android:fromYScale="0.4"
        android:toXScale="1.2"
        android:toYScale="1.2"
        android:pivotX="50%"
        android:pivotY="50%">
    </scale>
    <!--移动标签:fromXDelta,toXDelta表示x轴移动的像素点;fromYDelta,toYDelta表示Y轴移动的像素点-->
    <translate
        android:fromXDelta="0"
        android:toXDelta="300"
        android:fromYDelta="0"
        android:toYDelta="300"
        >
    </translate>
</set>

view使用这个动画

		ImageView image = findViewById(R.id.img);
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.view_animation_test);
        animation.setDuration(10000);//设置持续事件
        image.startAnimation(animation);

2、帧动画

帧动画有点像幻灯片,不适用于大图片使用,容易出现OOM
在res/drawable文件夹下新建文件

<?xml version="1.0" encoding="utf-8"?>
<!--
	根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画
	根标签下,通过item标签对动画中的每一个图片进行声明
	android:duration 表示展示所用的该图片的时间长度
 -->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >
    <item android:drawable="@drawable/d1" android:duration="500"/>
    <item android:drawable="@drawable/d2" android:duration="500"/>
    <item android:drawable="@drawable/d3" android:duration="500"/>
    <item android:drawable="@drawable/d4" android:duration="500"/>
    <item android:drawable="@drawable/d5" android:duration="500"/>
</animation-list>

view使用这个动画

image.setImageResource(R.drawable.drawable_animation);
        AnimationDrawable animationDrawable = (AnimationDrawable) image.getDrawable();
        animationDrawable.start();

3、属性动画

属性动画中有两个重要的类
ObjectAnimation:先设置属性值,自动赋值给对象
ValueAnimation:先设置属性值,手动赋值给对象属性
简单用法:

	final ImageView pimg = findViewById(R.id.p_img);
        /*ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(pimg,"alpha",1.0f,0.3f);
        objectAnimator.setDuration(5000);
        objectAnimator.setStartDelay(3000);
        objectAnimator.start();*/
        /*ValueAnimator animator = ValueAnimator.ofFloat(0f, 100f);
        animator.setDuration(5000);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //百分比对应的值
                float value = (float) animation.getAnimatedValue();
                Log.e("TAG", "onAnimationUpdate: " + value);
                pimg.setScaleX(0.5f + value / 200);
                pimg.setScaleY(0.5f + value / 200);
            }
        });
        animator.start();*/

        ObjectAnimator animator1 = ObjectAnimator.ofFloat(pimg, "translationX", 0f, 100f);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(pimg, "alpha", 0f, 1f);
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(pimg, "scaleX", 0f, 1f);
        animator3.setRepeatCount(ValueAnimator.INFINITE);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(5000);
        //动画1,2同时执行
        animatorSet.play(animator1).with(animator2);
        //动画2执行完成后执行动画3
        animatorSet.play(animator3).after(animator2);

        animatorSet.start();

对于ofFloat()函数那些不作进一步说明,有兴趣的可以去这里查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值