# FrameAnimation
**Repository Path**: clunyes/FrameAnimation
## Basic Information
- **Project Name**: FrameAnimation
- **Description**: High-Performance Frame Animation Library For Android
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-26
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## FrameAnimation
用TextureView或SurfaceView 高性能播放帧动画,避免在很多帧的情况下使用AnimationDrawable带来的OOM和卡顿问题。
***华为 mate 20X 1920×1080 24bit color JPG 201frames 24fps 测试效果***

### download
#### use Gradle
1. project gradle
```groovy
//...
repositories {
//...
jcenter()
}
//...
```
2. module gradle
```groovy
implementation 'com.yuyashuai.frameanimation:frameanimation:2.3.5'
```
### usage
#### xml
```xml
```
**务必将`AnimationView`的生命周期与所在的`Activity`或`Fragment`绑定**
````kotlin
override fun onPause() {
animationView.onPause()
super.onPause()
}
override fun onResume() {
super.onResume()
animationView.onResume()
}
````
> 不绑定,在播放的过程中进行页面跳转,可能会导致crash。
#### 动画播放
##### 1. 从文件夹中读取
````kotlin
//传入文件路径
animationView.playAnimationFromFile("zone720p")
````
##### 2. 从assets目录中读取
```kotlin
//传入文件夹在assets中的路径
animationView.playAnimationFromAssets("zone720p")
```
##### 3. 自定义、组合播放等
通过调用`playAnimation(paths: MutableList)`方法实现自定义资源的播放。
例:将assets中多个目录的动画合并为一个播放
```kotlin
val paths = FrameAnimationUtil.getPathList(applicationContext, "zone720p", "traffic720p")
animationView.playAnimation(paths)
```
#### 设置循环模式
通过`animationView.setRepeatMode()`,设置循环模式,内置了5种循环模式,你也可以参考[RepeatMode](https://github.com/yuyashuai/FrameAnimation/tree/master/frameanimation/src/main/java/com/yuyashuai/frameanimation/repeatmode)中的实现,通过实现`RepeatStrategy`接口来定义循环播放策略。
内置的5种循环播放模式,以**正常顺序为1, 2, 3, 4, 5为例**
1. `animationView.setRepeatMode(FrameAnimation.RepeatMode.INFINITE)`
**重复播放:** 播放顺序:1, 2, 3, 4, 5, 1, 2, 3, 4, 5...
2. `animationView.setRepeatMode(FrameAnimation.RepeatMode.ONCE)`
**单次播放:** 播放顺序:1, 2, 3, 4, 5
3. `animationView.setRepeatMode(FrameAnimation.RepeatMode.REVERSE_INFINITE)`
**往复循环:** 播放顺序1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5...
4. `animationView.setRepeatMode(FrameAnimation.RepeatMode.REVERSE_ONCE)`
**往复一次:** 播放顺序1, 2, 3, 4, 5, 4, 3, 2, 1
5. `animationView.setRepeatMode(RepeatTail(3))`
从指定帧开始循环播放
**尾部循环:** 播放顺序1, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5...
> 由于没有对传入文件夹中的非图片文件进行过滤,请保证传入文件夹内皆为有效图片,否则会造成crash。
#### 其它设置
##### 设置缩放模式
`animationView.setScaleType()`
参考`ImageView`的缩放模式,该设置播放中立即生效,也可以通过`setMatrix(matrix)`直接设置变换矩阵。
##### 设置帧间隔
单位ms
`animationView.setFrameInterval(12)`
> 帧间隔默认为42ms≈24fps,具体播放速度受设备性能影响,如果设置过小,会以设备能达到的最快速度播放,该设置播放中立即生效
##### 设置自动恢复播放
`animationView.restoreEnable=true`
当View不可见时(包含页面跳转等情况),将自动停止播放并释放部分资源。
停止播放时会保留上次的播放记录,再次进入默认会自动恢复播放,如果不想自动恢复,可以设置`restoreEnable=false`。
##### 设置是否支持图片复用
> 图片复用能够避免内存抖动,但是要求所有图片大小(**分辨率与色位**)必须一致(或后一帧的大小总是小于前一帧),**因此强烈建议所有帧图片的大小都一致**。
`animationView.setSupportInBitmap(true)`
默认为ture,当设置为false时,将带来显著的内存抖动。**如果你的所有帧图片大小一致,则不用设置**,如果不一致请设置为false。
> Ps. 如果设置为ture但是图片大小不一致会导致复用失败,然后再次尝试以不复用的方式加载图片,所以图片大小不一致的情况下设置为false能带来性能的提升。
##### 设置播放后不清屏
`animationView.freezeLastFrame(true)`
动画播放结束后,将会保留最后一帧,默认清屏。
##### 设置动画播放监听
`animationView.setAnimationListener()`
##### 所有设置
参考 [AnimationController](https://github.com/yuyashuai/FrameAnimation/blob/master/frameanimation/src/main/java/com/yuyashuai/frameanimation/AnimationController.kt)
### 注意事项
* 不兼容`RecyclerView`或者`ListView`进行兼容。**不要在`RecyclerView`或者`ListView`中使用**
* **务必将`AnimationView`的生命周期与所在的`Activity`或`Fragment`绑定**
* 如果在`Dialog`或`PopupWindow`等拥有单独`window`的容器中播放,需设置`animationView.autoRelease=false`,以保证`dismiss`后可以再次播放。
### TextureView or SurfaceView
[TextureView](https://developer.android.com/reference/android/view/TextureView)必须运行在支持硬件加速的上,与[SurfaceView](https://developer.android.com/reference/android/view/SurfaceView) 不同,可以和常规View进行变换等操作,更多请参考官方[Wiki](https://developer.android.com/reference/android/view/TextureView).
### issue
有问题[加issue](https://github.com/yuyashuai/SilkyAnimation/issues/new)。
### 最后
对于复杂的动效,帧动画体积大、内场占用高、CPU占用高,可能是很差强人意的解决方案了。如果你们开发、设计资源允许的话,或许你可以采用更好的解决方案。比如
* [Spine](http://zh.esotericsoftware.com/)
* [Lottie](https://github.com/airbnb/lottie-android)
> 但是上面的解决方案对于设计来说的确又是一个考验,像lottie要求用必须用AE设计动画并导出(劝退了一波用Flash/Animator的人),而且要求AE素材中不能有非矢量图,不然多帧一样OOM(又劝退了一波用AE的,比如我们很多AE的素材直接来自PS而不是AI)。