为什么需要动画播放框架?
Android中实现动画有几种方式
(1)Frame Animation(逐帧动画)
(2)Tween Animation (补间动画)
(3)Property Animation(属性动画)
(4)GIF/WebP动画图片
方案1的缺点在于需要将动画拆分成一张张图,体积大。
方案2、3实现难度大,开发人员需要每一步都细细调参,效率低低。
此外如果需要更换动画,需要进行客户端的更新。
方案4 gif实际上和帧动画类似,将一张张图片打包压缩成gif。随便一个gif的体积
由此可以引出本文的主题,通过动画播放框架进行复杂的动画播放效果。
现在主流的动画播放框架主要有Lottie,SVGA。
UI设计师按照约定的动画语法作图给开发人员即可,开发人员使用框架中指定的方式去播放动画即可。
Lottie,SVGA这两个动画框架都同时支持Android,iOS。因为工程中使用的SVGA,所以这里进行SVGA的学习和介绍。
怎么用?
1.引入依赖
先在build.gradle添加以下代码
allprojects { repositories { ... maven { url 'https://jitpack.io' } } } |
dependencies { implementation 'com.github.yyued:SVGAPlayer-Android:latest'//latest 替换成最新的版本号 } |
2.布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.opensource.svgaplayer.SVGAImageView android:layout_height="match_parent" android:layout_width="match_parent" app:autoPlay="true" android:background="#000" /> </RelativeLayout> |
3.MainActivity中
public class MainActivity extends AppCompatActivity { private SVGAImageView svgaImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); svgaImageView = findViewById(R.id.svgaImageView); //设置播放次数 0代表循环播放 svgaImageView.setLoops(1); SVGAParser parser = new SVGAParser(this); //设置监听器,进行对动画播放的控制。 svgaImageView.setCallback(new SVGACallback() { @Override public void onPause() { Log.d(TAG, "onPause"); } @Override public void onFinished() { Log.d(TAG, "onFinished"); } @Override public void onRepeat() { Log.d(TAG, "onRepeat"); } @Override public void onStep(int i, double v) { //看源码的意思是 i代表第i帧图片,v代表动画进度 Log.d(TAG, "onStep: i=" + i + " v=" + v); } }); //parse有几种解析的方式 (1)资源文件asset(2)url(3)输入流inputStream,具体可以看源码,这里直接用assets文件的方式。 //animationFileName是文件名 parser.decodeFromAssets(animationFileName,new SVGAParser.ParseCompletion() { @Override public void onComplete(@NotNull SVGAVideoEntity videoItem) { SVGADrawable drawable = new SVGADrawable(videoItem); svgaImageView.setImageDrawable(drawable); svgaImageView.startAnimation(); } @Override public void onError() { Log.i(TAG, "error"); } }); // svgaImageView.pauseAnimation();暂停动画 // svgaImageView.stopAnimation();停止动画 } } |
这里就是最简单的使用,更高级的用法会结合后面的进行介绍