美文网首页Android 进阶之旅
Android 进阶学习(十七) android 动画学习

Android 进阶学习(十七) android 动画学习

作者: Tsm_2020 | 来源:发表于2020-12-29 17:33 被阅读0次

    又到了一年的年终,最近公司新增加了一套新的埋点方案,虽然没有什么难度,但是写起来真是醉生梦死,差不多写了半个月吧,大部分功能算是完事了,今天继续我们的学习旅程,

    Android 动画分类

    1.帧动画

    代码

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android">
       <item  android:drawable="@mipmap/search_tjjp"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_tongji"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_wdzyk"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_xlxx"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_yjxcd"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_ywxl"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_zhgl"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_zj"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_zjjl"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_zycx"  android:duration="300"></item>
       <item  android:drawable="@mipmap/search_zyhb"  android:duration="300"></item>
    </animation-list>
    

    我们只需要让imageview 引用这个动画就可以了

        iv_1.setImageResource(R.drawable.anim_list);
           AnimationDrawable animationDrawable1 = (AnimationDrawable) iv_1.getDrawable();
           animationDrawable1.start();
    

    效果图


    GIF 2020-12-29 16-30-40.gif

    帧动画的逻辑就是加载所有图片,然后逐帧的将它播放出来,使用起来没有什么难度,但是图片不能太大,也不用区分的太细,比较浪费内存

    2.补间动画 Animation

    GIF 2020-12-29 16-32-11.gif

    补间动画可以实现控件的移动和缩放,通常用在打开activity和dialog 中,从图片中可以看到虽然控件移动了,但是我们点击控件最后的位置是不可以触发点击事件的,我们点击控件初始位置是可以触发点击事件的,类似是投射一个影子,并不是真正的移动,其实控件还在原来的位置
    使用方法,java 代码

      animation = new TranslateAnimation(0f,200f,0f,200f);
      animation.setDuration(2000);
      animation.setFillAfter(true);
      animation.setRepeatCount(0);
      animation.setRepeatMode(Animation.RESTART);
      iv_image_top.startAnimation(animation);
    

    同时我们还可以创建xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <translate
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:duration="2000"
       android:fromXDelta="0"
       android:fromYDelta="0"
       android:toXDelta="100%"
       android:toYDelta="100%"
       android:fillAfter="true"/>
    

    现在只是使用一种动画,如果想要嵌套多个动画则需要使用set

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@[package:]anim/interpolator_resource"
       android:shareInterpolator=["true" | "false"] >
       <alpha
           android:fromAlpha="float"
           android:toAlpha="float" />
       <scale
           android:fromXScale="float"
           android:toXScale="float"
           android:fromYScale="float"
           android:toYScale="float"
           android:pivotX="float"
           android:pivotY="float" />
       <translate
           android:fromXDelta="float"
           android:toXDelta="float"
           android:fromYDelta="float"
           android:toYDelta="float" />
       <rotate
           android:fromDegrees="float"
           android:toDegrees="float"
           android:pivotX="float"
           android:pivotY="float" />
       <set>
           ...
       </set>
    </set>
    

    3.属性动画 Animator

    GIF 2020-12-29 16-37-38.gif

    属性动画的点击事件时随着控件移动而移动的,点击原有位置是没有作用的,属性动画的实质是通过数值的变化来改变属性,也就是ValueAnimator 的应用
    使用方法

       private void startAnimator() {
           ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(iv_image_top, "alpha", 1.0f, 0.5f, 0.8f, 1.0f);
           ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(iv_image_top, "scaleX", 0.0f, 2.0f);
           ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(iv_image_top, "scaleY", 0.0f, 2.0f);
           ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(iv_image_top, "rotation", 0, 360);
           ObjectAnimator transXAnim = ObjectAnimator.ofFloat(iv_image_top, "translationX", 100, 400);
           ObjectAnimator transYAnim = ObjectAnimator.ofFloat(iv_image_top, "translationY", 100, 750);
           AnimatorSet set = new AnimatorSet();
           set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);
           set.setDuration(3000);
           set.start();
       }
    

    上面我们实现的水平和垂直方向的平移,既然是通过数值来改变属性,我们如何自义定变换方法呢,

         ValueAnimator animator=ValueAnimator.ofObject(new TypeEvaluator() {
               @Override
               public Object evaluate(float fraction, Object startValue, Object endValue) {
                   return null;
               }
           },0,1);
    

    这个方法就是改变value的方法,fraction 的意思就是从初始值变了多少

    xml 使用方法

    <objectAnimator
               android:propertyName="x"
               android:duration="500"
               android:valueTo="400"
               android:valueType="intType"/>
    

    总结

    1.在xml中使用补间动画的复用率非常高,可以应用在Activity 和Dialog 上面,基本上所有的app都会用到

    2.补间动画在执行动画过程中的点击事件还保留在原有位置,实现过程有点类似投射一个影子显示出来实际位置并没有发生变化,

    3.属性动画是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等。

    4.帧动画现在应用的比较少了,比较浪费内存,如果想要实现动画效果一般使用gif或者lottie 来解决,但是在使用lottie的时候发现有时会出现丢帧的情况,如果是简单的动画还可以使用SVG这种方式,从网上找一个连接大家可以看一下,对于SVG 图画的定义非常细致,https://juejin.cn/post/6844903481564741645

    相关文章

      网友评论

        本文标题:Android 进阶学习(十七) android 动画学习

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