美文网首页
Android动画

Android动画

作者: 云木杉 | 来源:发表于2019-10-18 14:28 被阅读0次

    简介

    View的动画大体上划分为三种,补间动画(View动画)、帧动画以及属性动画,其中属性动画是5.0(api 11)以后才有的

    • View动画作用于View,是对当前view的一系列操作(平移,旋转,缩放,透明),可以混合操作。四种动画操作可以通过xml制定,也可以通过代码来编写。
    • 帧动画是按照一定顺序播放既有的一系列图片的过程。
    • 属性动画,作用于对象

    View动画(Tween动画 补间动画)

    优缺点,优点肯定是使用起来,操作简单,效果也比较流畅,但缺点也很明显,可拓展性太差,只能写移动、缩放、旋转、渐变四种动画,以及这四种动画的组合。还有一个缺点是动画只是绘制到了屏幕上,View的属性并没有发生变化,最典型的就是一个Button从一个位置移动到另一个地方,但点击事件还在原地。

    • TranslateAnimation
      位移动画
    • ScaleAnimation
      缩放动画
    • RotateAnimation
      旋转动画
    • AlphaAnimation
      透明动画(淡入淡出)
    // pivot决定了当前动画执行的参考位置,相当于动画开始的起点,以百分比为数值,主要是在translate 和 scale 动画中
    
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        // Interpolator主要作用是可以控制动画的变化速率,就是动画进行的快慢节奏。
        android:interpolator="@[package:]anim/interpolator_resource"  
        android:fillAfter="true">
        <translate
            android:duration="100"
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="100"
            android:toYDelta="100" />
    
           <scale
            android:duration="3000"
            android:fromYScale="0"
            android:fromXScale="0"
            android:pivotX="0%"
            android:pivotY="50%"
            android:toYScale="1.0"
            android:toXScale="1.0"/>
    
    
        <rotate
            android:duration="1000"
            android:fromDegrees="0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:repeatCount="1"
            android:repeatMode="reverse"
            android:toDegrees="359" />
    </set>
    
    
    // 代码示例
    Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
    img = (ImageView) findViewById(R.id.img);
    img.startAnimation(animation);
    
    
    

    帧动画

    原理就有点像播放幻灯片时,传一组图片进去,然后依次播放。可以通过xml创建,也可以Java代码动态构建。缺点就是动画不连续,解决办法呢就是把图片做的多一些,但体积又会变大,很尴尬的问题。

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
                    android:oneshot="false">
        <item android:drawable="@mipmap/run_1" android:duration="150" />
        <item android:drawable="@mipmap/run_2" android:duration="150" />
        <item android:drawable="@mipmap/run_3" android:duration="150" />
        <item android:drawable="@mipmap/run_4" android:duration="150" />
    </animation-list>
    
    ImageView image = (ImageView) findViewById(R.id.iv_1);
    image.setImageResource(R.drawable.animation_list);
    AnimationDrawable anim = (AnimationDrawable) image.getDrawable();
    anim.start();
    
    

    属性动画

    • ValueAnimator
      ValueAnimator的功能就是在两个数值范围内,顺序地产生过渡数值,过渡速率可以通过intepolator来控制,过渡时间通过duration来控制,最终产生数值序列。

    属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

    工作原理

    舒心动画要求动画作用的对象提供该属性的set方法,属性动画根据你传递的该属性的初始值和最终值,以动画的效果多次去调用set方法。每次传递给set方法的值都不一样,确切来说随着时间的推移,所传递的值越来越接近最终值。如果动画的时候没有传递初始值,那么还要提供get方法,因为系统要去获取属性的初始值。

    插值器和估值器

    • Interpolator中文翻译为插值器。作用于更具流逝的百分比算出当前属性值改变的百分比。
    • TypeEvaluator 类型估值。作用于根据当前属性改变的百分比来计算改变后的属性值。
    ValueAnimator animator = ValueAnimator.ofFloat(0, 90);
            animator.setDuration(3000);
            animator.setInterpolator(new AccelerateInterpolator());
            animator.setRepeatCount(1);
            animator.setRepeatMode(ValueAnimator.REVERSE);
            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator valueAnimator) {
                    float value = (float) valueAnimator.getAnimatedValue();
                    image.setRotationY(value);
                }
            });
            animator.start();
    
            // ObjectAnimator 更简洁
            ObjectAnimator animator = ObjectAnimator.ofFloat(image, "rotationY", 0, 359);
            animator.setDuration(1000);
            animator.setRepeatCount(1);
            animator.setRepeatMode(ValueAnimator.REVERSE);
            animator.start();
    
    ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.5f, 0.8f, 1.0f);
                    ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f);
                    ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 0.0f, 2.0f);
                    ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(myView, "rotation", 0, 360);
                    ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400);
                    ObjectAnimator transYAnim = ObjectAnimator.ofFloat(myView, "tranlsationY", 100, 750);
                    AnimatorSet set = new AnimatorSet();
                    set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
    //                set.playSequentially(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
                    set.setDuration(3000);
                    set.start();
    
    // ValueAnimator采用<animator>  标签
    <animator xmlns:android="http://schemas.android.com/apk/res/android"  
        android:valueFrom="0"   // 初始值
        android:valueTo="100"  // 结束值
        android:valueType="intType" // 变化值类型 :floatType & intType
    
        android:duration="3000" // 动画持续时间(ms),必须设置,动画才有效果
        android:startOffset ="1000" // 动画延迟开始时间(ms)
        android:fillBefore = “true” // 动画播放完后,视图是否会停留在动画开始的状态,默认为true
        android:fillAfter = “false” // 动画播放完后,视图是否会停留在动画结束的状态,优先于fillBefore值,默认为false
        android:fillEnabled= “true” // 是否应用fillBefore值,对fillAfter值无影响,默认为true
        android:repeatMode= “restart” // 选择重复播放动画模式,restart代表正序重放,reverse代表倒序回放,默认为restart|
        android:repeatCount = “0” // 重放次数(所以动画的播放次数=重放次数+1),为infinite时无限重复
        android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影响动画的播放速度,下面会详细讲
    
    />  
    

    矢量动画(纯粹的做个笔记)

    • vector:显示一个矢量图形,用SVG的语法构建Path
    • animated-vector:组合两个vector,让vector动起来
    • animated-selector:组合两个animated-vector,实现双向切换动画

    相关文章

      网友评论

          本文标题:Android动画

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