当前位置: 首页 > news >正文

Android自定义View-SVG动画

1、SVG与Bitmap的区别:

SVG是可缩放矢量图形,全称Scalable Vector Graphics。经过数学计算利用直线和曲线绘制而成,无论怎么放大,都不会出现马赛克现象。可以使用Illustrator矢量图绘图软件来进行绘图。

Bitmap 是位图,由一个个像素点组成,放大后会出现马赛克。可以使用PhotoShop位图绘图软件来进行绘图。

2、SVG的优势:

1、使用xml格式定义图形,读取和修改的工具多。

2、不会失真,无需根据分辨率适配多套图标。

3、占用空间小。

4、可以转换为Path路径,与Path动画相结合,形成更丰富的动画。

3、静态SVG的使用

1、使用Android Studio转换美工提供的SVG文件为vector的xml文件:

Android Studio->File->New->Vector Asset->Local File->RTL->drawable/ic_love.xml

2、加载vector的xml文件:

<ImageView
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    android:layout_width="100dp"
    android:src="@drawable/ic_love"
    android:layout_height="100dp"></ImageView>

4、动态SVG的使用

1、使用Android Studio转换美工提供的SVG文件为vector的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="72dp"
    android:height="50dp"
    android:viewportWidth="72.0"
    android:viewportHeight="50.0">

    <path
        android:name="animate_logo_target"
        android:pathData="M60,5,L10,5,V15,A1,1,0,0,0,65,20,L65,10"
        android:strokeWidth="10"
        android:strokeColor="#03DAC5" />
</vector>

2、创建SVG对应的动画

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:propertyName="trimPathEnd"
    android:repeatCount="0"
    android:valueFrom="0"
    android:valueTo="1"
    android:valueType="floatType"/>

其中propertyName:

trimPathStart 属性表示截掉从起点到某个位置的部分,保留剩下的部分;

trimPathEnd 属性表示截掉从某个位置到终点的部分,保留剩下的部分。

3、启动动画

private void start() {
    AnimatedVectorDrawableCompat animatedVectorDrawableCompat = AnimatedVectorDrawableCompat.create(
            this, R.drawable.ic_logo
    );
    mIvSvgVectorAnimation.setImageDrawable(animatedVectorDrawableCompat);
    ((Animatable) mIvSvgVectorAnimation.getDrawable()).start();
}

5、Lottie加载SVG动画

Lottie可以轻松加载SVG动画,只需美工提供JSON文件即可,Lottie的GitHub地址:https://github.com/airbnb/lottie-android

1、test.json文件置于assets文件夹中。

2、编写布局控件:

<com.airbnb.lottie.LottieAnimationView
    android:id="@+id/animation_view"
    android:layout_width="wrap_content"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    android:layout_height="wrap_content"
    app:lottie_loop="true"
    app:lottie_autoPlay="true" />

3、启动动画

private void initTest() {
    mLavGift.setAnimation("test.json");
    mLavGift.setRepeatCount(INFINITE);
    mLavGift.playAnimation();
}

6、SVGA加载SVG动画

SVGA可以轻松加载SVG动画,只需美工提供SVGA文件即可,SVGA的GitHub地址:https://github.com/svga/SVGAPlayer-Android

1、posche.svga置于assets文件夹中。

2、直接编写布局控件加载:

<com.opensource.svgaplayer.SVGAImageView
    android:layout_height="200dp"
    android:layout_width="200dp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:source="love.svga"
    app:autoPlay="true"
    android:id="@+id/svga_test"/>

3、从assets中加载:

SVGAImageView svgaImageView = new SVGAImageView(this);
SVGAParser.Companion.shareParser().init(this);
SVGAParser parser = SVGAParser.Companion.shareParser();
parser = new SVGAParser(this);
parser.decodeFromAssets("posche.svga", new SVGAParser.ParseCompletion() {
    @Override
    public void onComplete(SVGAVideoEntity svgaVideoEntity) {
        SVGADrawable drawable = new SVGADrawable(svgaVideoEntity);
        svgaImageView.setImageDrawable(drawable);
        mFlSvga1.addView(svgaImageView );
        svgaImageView.startAnimation();
    }

    @Override
    public void onError() {

        System.out.println("解析错误decodeFromAssets");
    }
});

4、从url中加载:

SVGAImageView svgaImageView1 = new SVGAImageView(this);
SVGAParser parser1 = SVGAParser.Companion.shareParser();
parser1 = new SVGAParser(this);
URL url = new URL("https://github.com/yyued/SVGA-Samples/blob/master/posche.svga?raw=true");
parser1.decodeFromURL(url, new SVGAParser.ParseCompletion() {
    @Override
    public void onComplete(SVGAVideoEntity svgaVideoEntity) {
        SVGADrawable drawable = new SVGADrawable(svgaVideoEntity);
        svgaImageView1.setImageDrawable(drawable);
        mFlSvga2.addView(svgaImageView1 );
        svgaImageView1.startAnimation();
    }

    @Override
    public void onError() {
        System.out.println("解析错误decodeFromURL");
    }
});

在项目中对于复杂的SVG动画一般都是用Lottie和SVGA加载,而对于Lottie和SVGA的区别,后续将会单独写一篇文章进行比较。

DEMO地址:https://github.com/chaozhouzhang/CustomProgressView


技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

推荐阅读:

音视频面试基础题

OpenGL ES 学习资源分享

一文读懂 YUV 的采样与格式

OpenGL 之 GPUImage 源码分析

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

相关文章:

  • 谈一谈Flutter外接纹理
  • Android 11 强制用户使用系统相机?
  • 3A之自动白平衡(AWB)篇
  • Shader基础技巧整理
  • 一起用Gradle Transform API + ASM完成代码织入呀~
  • 用shader做一个柿子颜色的过场动画
  • 只需跟着Google学android:ViewModel篇
  • 我用 OpenGL 实现了那些年流行的相机滤镜
  • 有必要去研究Handler和Binder么?
  • 音视频交流群又来啦~~~
  • Android 手机如何拍摄RAW图
  • 华为手机刷微博体验更好?技术角度的分析和思考
  • 播放视频时如何调整音频的音量
  • 视频码控:CBR、VBR和ABR
  • OpenGL ES 相机 LUT 滤镜
  • 【翻译】babel对TC39装饰器草案的实现
  • iOS | NSProxy
  • JavaScript异步流程控制的前世今生
  • Lsb图片隐写
  • Nacos系列:Nacos的Java SDK使用
  • ng6--错误信息小结(持续更新)
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Redis中的lru算法实现
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue-cli3搭建项目
  • vue学习系列(二)vue-cli
  • webpack+react项目初体验——记录我的webpack环境配置
  • 测试如何在敏捷团队中工作?
  • 记一次删除Git记录中的大文件的过程
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端面试之CSS3新特性
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 数组大概知多少
  • gunicorn工作原理
  • puppet连载22:define用法
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 安徽锐锋科技IDMS系统简介
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (WSI分类)WSI分类文献小综述 2024
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Java算法:二分查找
  • (一)WLAN定义和基本架构转
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • . Flume面试题
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 指南:抽象化实现的基类
  • .NET 中的轻量级线程安全
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题