Android 进阶之旅

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

2020-12-29  本文已影响0人  Tsm_2020

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

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

上一篇下一篇

猜你喜欢

热点阅读