一:帧动画(FameAnimation)

    帧动画是一帧一帧的播放的,通过快数播放图片达到动画的效果

    帧动画的使用有两种方式:

    1:通过xml配置帧动画

             在drawable文件下创建xml文件

帧动画与补间动画的使用,_移动开发

        将文件改为anim_list,并将图片一张一张的按播放的顺序添加上去,先播放的先添加,duration设置时间

(imageView2.drawable as AnimationDrawable).apply {
    start()
}//imageView2是图片的id

2:通过代码配置帧动画:创建AnimationDrawable对象->为其添加用于动画的图片->将AnimationDrawable添加到相应的view上->启动动画
AnimationDrawable().apply {
//通过addFrame(1,2)为帧动画添加一帧的图片,1:需要要一个Drawable(通过getDrawable()获取),2:动画的时长
    getDrawable(R.drawable.campfire01)?.let {
        addFrame(it,100)
    }
    getDrawable(R.drawable.campfire02)?.let {
        addFrame(it,100)
    }
    getDrawable(R.drawable.campfire03)?.let {
        addFrame(it,100)
    }
}.also {
//将AnimationDrawable添加到相应的view上
 imageView2.setImageDrawable(it)
//启动动画
 it.start()}

二:补间动画(TweenAnimation)
1:补间动画只是在视觉上给了我们一种动画的感觉,但是控件本身的位置状态是没有被改变的,如把控件C从A位置移动到B位置,
    在视觉上控件C已经被移动到了B位置上,但是如果需要点击控件C那么需要点击A的位置,即使控件还在A位置。

2:补间动画分为:
AlphaAnimation :透明度变化的动画
TranslateAnimation:位子移动的动画
ScaleAnimation:大小伸缩的动画
RotateAnimation:旋转的动画
AnimationSet:动画的结合,将以上几种动画结合在一起

3:补间动画常用的属性:
fillafter:True或者false,是否保持动画结束后的状态
fillbefer:是否回到动画开始的状态,默认是设置为true
duration:动画的时间
repeat():重置
repeatMode:在次动画的模式(RESTART:从头开始,REVEASE:从尾开始,即从上一次动画结束的位置开始)
repeatCount:动画重复的次数,INFINITE:无数次
start():开始动画
cancel():取消动画
4:setAnimationListener:为动画添加动画
it.setAnimationListener(object :Animation.AnimationListener{
    override fun onAnimationRepeat(animation: Animation?) {
     /*动画当动画通过 setRepeatMode() / setRepeatCount()
      或 repeat() 方法重复执行时,这个方法被调用。
    */
    }
    override fun onAnimationEnd(animation: Animation?) {
      //当动画结束时使用
    }
    override fun onAnimationStart(animation: Animation?) {
      //当动画开始时使用
    }
})

5:补间动画实现的方式;
   (1):xml配置
      在res文件下创建一个Resource Ddirectory文件anim(动画的都放在这个文件里面)

帧动画与补间动画的使用,_移动开发_02

             在创建的anim文件下创建Resource File文件

             将文件开头的set改为自己需要的模式,并配置xml文件,这儿的透明度的变化便是从0到1

我需要改变透明度的变化便改为alpha了,若是需要拉伸则改为scale

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
    android:toAlpha="1.0"
    />
     获取创建的xml文件并设置其属性,后再启动动画
  //xml配置淡入
private  fun fade_inandout_xml(){
//通过AnimationUtils.loadAnimation(1(上下文),2(配置的xml文件资源))获取文件
      AnimationUtils.loadAnimation(this,R.anim.fade_in).apply {
//配置相应的属性,这些属性也可以设置在xml文件中,但是xml文件中不提示
          duration = 2000
          fillAfter = true
          repeatMode = Animation.RESTART
      }.also {
//监听动画
          it.setAnimationListener(object :Animation.AnimationListener{
              override fun onAnimationRepeat(animation: Animation?) {
               /*动画当动画通过 setRepeatMode() / setRepeatCount()
                或 repeat() 方法重复执行时,这个方法被调用。
              */
              }
              override fun onAnimationEnd(animation: Animation?) {
                //当动画结束时使用
              }
              override fun onAnimationStart(animation: Animation?) {
                //当动画开始时使用
              }
          })
//通过startAnimation()将动画添加到视图上并且启动动画
          imageView2.startAnimation(it)

      }
  }
移动:
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0" 
    android:toXDelta="200" 在x轴上的变化
    android:fromYDelta="0"
    android:toYDelta="0"  在y轴上的变化
    />
这个操作都是一样的,以下就不一一写了
AnimationUtils.loadAnimation(this,R.anim.trans).apply {
    duration = 2000
    fillAfter = true
}.also {
    imageView2.startAnimation(it)
}
拉伸
,Animation.RELATIVE_TO_SELF相对自身而言,pivotx就是设置相对自身的在x位置上的200倍的位置
,Animation.RELATIVE_TO_PARENT相对父容器而言,pivotx在x上的位置在父容器的宽度的200倍的位置
xml配置文件中默认为Animation.ABSOLUTE
    android:pivotX="200"
    android:pivotY="200"
    />

旋转:
集合:
使用百分比就是相对自身而言的
 
  (2):代码实现
     透明度
AlphaAnimation(0.0f,1.0f).apply {
    duration = 3000
    fillAfter = true
    repeatMode = Animation.REVERSE
}.also { 
    imageView2.startAnimation(it)
} 
    移动:
  TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,
                       Animation.RELATIVE_TO_SELF,1f,
                       Animation.RELATIVE_TO_SELF,0f,
                       Animation.RELATIVE_TO_SELF,1f).apply {
                             duration = 2000
                                fillAfter = true
                         }.also {
                                imageView2.startAnimation(it)
                                 }
拉伸:
ScaleAnimation(0f,500f,0f,500f).apply {
    duration = 2000
    imageView2.startAnimation(this)
}
旋转:
RotateAnimation(0f,180f).apply { 
    duration = 2000
    imageView2.startAnimation(this)
}
集合:
val scale = ScaleAnimation(0f,50f,0f,50f)
  val rotate = RotateAnimation(0f,180f)
  AnimationSet(true).apply {
添加动画
      addAnimation(scale)
      addAnimation(rotate)
      duration = 2000
      imageView2.startAnimation(this)
  }