天涯论坛

 找回密码
 立即注册
搜索
查看: 9|回复: 1

Android SVG运用之AnimatedVectorDrawable

[复制链接]

3089

主题

3万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098770
发表于 2024-10-3 11:12:19 | 显示全部楼层 |阅读模式

今日科技快讯

近期有统计公司在北京颁布:2016届中国大学毕业生在毕业半年后的就业率为91.6%,这些毕业生平均月收入达到3988元。本科专业中,列在“高薪榜”前五位的专业分别是信息安全(5906元),软件工程(5869元),网络工程(5600元),微电子学(5503元)和计算机科学与技术(5452元)。

作者简介

本篇来自 Nemo 的投稿,仔细地介绍了SVG的属性以及运用方式,感兴趣的伴侣能够自己试一试。另一点击最后 阅读原文 可查看有些SVG关联资料的链接。

Nemo 的博客位置

http://blog.csdn.net/nemo__

概述

SVG可缩放矢量图形(Scalable Vector Graphics),是运用XML来描述二维图形和绘图程序的语言,其定义遵循W3C标准。

在2003年1月,SVG 1.1被确立为W3C标准。运用 SVG 的优良在于:

SVG 可被非常多的工具读取和修改(例如记事本)

SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强

SVG 是可伸缩的

SVG 图像可在任何的分辨率下被高质量地打印

SVG 可在图像质量不下降的状况下被放大

SVG 图像中的文本是可选的,同期是可搜索的(很适合制作地图)

SVG 能够与 Java 技术一块运行

SVG 是开放的标准

SVG 文件是纯粹的 XML

下面的例子是一个简单的SVG文件的例子。SVG文件必须运用.svg后缀来保留

HTML页面中运用SVG

SVG 文件可经过以下标签嵌入 HTML 文档:<embed><object>  <iframe>

运用<embed>标签

<embed> 标签被所有主流的浏览器支持,并准许运用脚本。当在 HTML 页面中嵌入 SVG 时运用 <embed> 标签是 Adobe SVG Viewer 举荐办法!然而,倘若需要创建合法的 XHTML,就不可运用 <embed>。任何 HTML 规范中都 <embed> 标签。

运用<object>标签

<object>标签是HTML 4的标准标签,被所有较新的浏览器支持。它的缺点是不准许运用脚本。假如您安装了最新版本的Adobe SVG Viewer,那样运用<object>标签时SVG文件没法工作(最少不可在 IE 中工作)!

运用<iframe>标签

<iframe>标签可工作在大部分的浏览器中。

SVG<path>

SVG的<path>元素用于定义有些繁杂的图形,其定义在

W3 SVG Path

https://www.w3.org/TR/SVG11/paths.html#PathData

<path>可用的命令如下:

以上所有命令均准许小写字母。大写的字母是基于原点的坐标系(偏移量),即绝对位置;小写字母是基于当前点坐标系(偏移量),即相对位置。

所有绘制工作都是在<path>元素中经过 d属性 来完成的。

(1) 坐标轴为以(0,0)为中心,X轴水平向右,Y轴水平向下

(2) 命令与参数间的空格能够省略

M 250 150 M250 150

(3) 参数间能够运用空格或逗号隔开

M 250,150 M250,150

(4) 同一指令显现多次能够只用一个

M300,70 l 0,-70 70,70 0,0 -70,70z

(5) 命令大写字母基于坐标系原点,小写字母基于当前位置

假如虚拟画笔起始绘制的位置是(50,50),倘若运用的是L100,100指令,那样便是从(50,50)位置起始绘制直线,绘制到(100,100)的位置。倘若是l100,100指令,那样直线将从(50,50)位置起始绘制,绘制到(50+100,50+100)的位置。

(6) 闭合路径指的是从最后一个绘制点连线到起始点,这个命令是Z(或z,这儿体积区别)

SVG Stroke属性

SVG供给了一个范围广泛stroke 属性。在本章中,咱们瞧瞧下面:

stroke 定义一条线,文本或元素轮廓颜色

stroke-width 定义了一条线,文本或元素轮廓厚度

stroke-linecap定义区别类型的开放路径的终结,对接(butt)、圆形(round)和方形(square);

stroke-linejoin 掌控两条线段之间的衔接,三个值:尖角(miter)、圆角(round)和斜角(bevel);

stroke-miterlimitmiter-length 和 stroke-width 之间的比率做了限制,它的比值范围应大于或等于1。当比值不在这个范围的时候, stroke 就会被转换成斜角(bevel)。当 strokeLineJoin 设置为 “miter” 的时候,绘制两条线段以锐角相交的时候,所得的斜面可能相当长。当斜面太长,就会变得不协调。strokeMiterLimit属性为斜面的长度设置一个上限。这个属性暗示斜面长度和线条长度的比值。默认是10,寓意着一个斜面的长度不该该超过线条宽度的10倍。倘若斜面达到这个长度,它就变成斜角了。当strokeLineJoin为“round”或“bevel”的时候,这个属性无效。

stroke-dasharray 创建虚线

stroke-dashoffset设置需要图案延迟绘制的距离

stroke-opacity 线条,文本或元素轮廓透明度;

可能的取值如下:

以下为 stroke属性 的范例 stroke.avg,能够较好地理解各项含义:

<path>标签A指令

<path>标签 d属性 中,A指令 可用于画一段椭圆孤。

A指令格式

elliptical Arc (A RX,RY,XROTATION,large-arc-flag,sweep-flag,X,Y)

RX,RY  所在椭圆水平方向上的半径,垂直方向上的半径;RX 和 RY 设置为相同的值,将得到一个圆形的弧线  

XROTATION椭圆的X轴与水平方向顺时针方向夹角,能够想像成一个水平的椭圆绕中心点顺时针旋转XROTATION的方向

large-arc-flag,1暗示方向弧线,0为小方向弧线。

sweep-flag,确定从起点至终点的方向,1为顺时针,0为逆时针

X,Y 为终点坐标  

A指令图形详解,能够把arc.svg保留到本地,在浏览器中查看:

效果如下:

<path>标签画贝塞尔曲线

<path>标签d属性中,绘制贝塞尔曲线的命令包含

Q 二次贝赛尔曲线 x1,y1 x,y

T 平滑二次贝塞尔曲线 x,y

C 曲线(curveto) x1,y1 x2,y2 x,y

S 平滑曲线 x2,y2 x,y

(1) Q 二次贝塞尔曲线

Q指令格式:M x0,y0 Q x1,y1 x2,y2

经过M定义(x0,y0)为起点,用Q定义(x1,y1)为掌控点,(x2,y2)为终点,形成一条二次贝塞尔曲线。 Q办法非常简单直观。

效果如下:

(2) T 二次贝塞尔曲线平滑延伸

T指令格式:M x0,y0 Q x1,y1 x2,y2 T x4,y4

T命令是二次被赛尔曲线的平滑延伸命令,用Q定义了一段二次贝塞尔曲线后面,紧接着一个T命令,只需定义终点,就能够自动延伸出一条平滑的曲线。在这段曲线中,(x3,y3)手工定义,这儿运用的T办法,只定义一个终点,起点是上一段曲线的终点,掌控点则是上一段曲线的掌控点的对叫作点(相针对上一段曲线的终点)。

T命令前面必须是一个Q命令,是另一个T命令,才可达到这种效果。倘若T单独运用那样掌控点就会被认为和终点是同一个点,因此画出来的将是一条直线。

(3) C 三次贝塞尔曲线

C指令格式:M x0,y0 C x1,y1 x2,y2 x3,y3

C办法定义的是三次贝塞尔曲线,只是多了一个掌控点。

(4) S 三次贝塞尔曲线平滑延伸

S指令格式:M x0,y0 C x1,y1 x2,y2 x3,y3 S x5,y5 x6,y6

三次贝塞尔有一个平滑延伸的命令,需要定义一个掌控点和一个终点,命令会再自动生成一个掌控点x4,y4,从而形成一条延伸出来的三次贝赛尔曲线。

S命令前面必须是一个C命令,是另一个S命令,才可达到这种效果。倘若单独运用S命令,则会变成画二次贝塞尔曲线效果。 

Android SVG动画

AnimatedVectorDrawable类 运用 ObjectAnimator 和 AnimatorSet 来促进 VectorDrawable 属性渐变,来生成动画效果。

一般能够在3个XML文件中定义添加动画的矢量照片

在res/drawable/中持有元素的矢量照片

在res/drawable/中持有元素且已添加动画的矢量照片

在res/anim/中持有元素的一个或多个对象动画;

添加动画的矢量照片可为<group>以及<path>元素的属性添加动画。<group>元素定义路径集或子组,而<path>元素则定义将绘制的路径。

完成一个 AnimatedVectorDrawable 一般需要定义三种区别类型文件:

(1). android.graphics.drawable.VectorDrawable 对应的XML文件,它以<vector>为根。咱们可能让 path 或 group 的属性进行动画,因此呢需要对进行动画的 path 或 group 命名。

(2).android.graphics.drawable.AnimatedVectorDrawable 对应的XML文件,它以<animated-vector>为根。这儿定义需动画的 path 或 group 的<target>,<target>的animation属性指定为通常的 ObjectAnimator 或 AnimatorSet 对应的XML。

(3). android.graphics.drawable.Animator对应的XML文件,它以<set>,<objectAnimator>等为根,对应 AnimatorSet 和 ObjectAnimator。

VectorDrawable

VectorDrawable通常是以<vector>为根标签定义的XML文件,<vector>、<group>、<clip-path>、<path>元素都有各自能够播放动画的属性,查阅 SDK/docs/reference/android/graphics/drawable/VectorDrawable.html 你会找到每种元素到底有哪些属性,以便针对这些属性播放特定的动画。例如 trimPathStart 和 trimPathEnd 能够让已画的path以百分比的形式渐变显现

<vector>定义这个矢量图

android:name 矢量图的名字

android:width 矢量图的内部(intrinsic)宽度,支持所有Android系统支持的尺寸,一般运用dp

android:height 矢量图的内部(intrinsic)高度

android:viewportWidth 矢量图视图的宽度,视图便是矢量图path路径数据所绘制的虚拟画布

android:viewportHeight 矢量图视图的高度

android:tint 矢量图的tint颜色。默认是tint颜色的

android:tintMode 矢量图tint颜色的Porter-Duff混合模式,默认值为src_in。(src_in,src_over,src_atop,add,screen,multiply)

android:autoMirrored 设置当系统为RTL(right-to-left)布局的时候,是不是自动镜像该照片例如阿拉伯语。

android:alpha 该照片的透明度属性

<group>设置路径做动画的关键属性的

android:name 定义group的名字

android:rotation 定义该group的路径旋转多少度

android:pivotX 定义缩放和旋转该group时候的X参考点。该值相针对vector的viewport值来指定的。

android:pivotY 定义缩放和旋转该 group 时候的Y参考点。该值相针对vector的viewport值来指定的。

android:scaleX 定义X轴的缩放倍数

android:scaleY 定义Y轴的缩放倍数

android:translateX 定义移动X轴的位移。相针对vector的viewport值来指定的。

android:translateY 定义移动Y轴的位移。相针对vector的viewport值来指定的。

<path>

android:name 定义该path的名字,这般在其他地区能够经过名字来引用这个路径

android:pathData 和SVG中d元素同样的路径信息。

android:fillColor 定义填充路径的颜色,倘若定义则不填充路径

android:strokeColor 定义怎样绘制路径边框,倘若定义则不表示边框   android:strokeWidth 定义路径边框的粗细尺寸

android:strokeAlpha 定义路径边框的透明度

android:fillAlpha 定义填充路径颜色的透明度

android:trimPathStart 从路径初始位置截断路径的比率,取值范围从0到1;重视从一半到初始动画为from-0.5-to-0    android:trimPathEnd    从路径结束位置截断路径的比率,取值范围从0到1;重视从一半到结束动画为from-0.5-to-1.0

android:trimPathOffset 设置路径截取的范围,取值范围从0到1

android:strokeLineCap 设置路径线帽的形状,取值为 butt, round, square.

android:strokeLineJoin 设置路径交界处的连接方式,取值为 miter,round,bevel. android:strokeMiterLimit 设置斜角的上限

<clip-path> 定义当前绘制的剪切路径。重视,clip-path 只对当前的 group 和子 group 有效

android:name 定义clip-path的名字

android:pathData android:pathData的取值同样

根元素 <vector> 上有两个宽高设置,其中 viewport 是指矢量图里面的画布体积,而 android:width 和 android:height 指的是该矢量图所对应的 VectorDrawable 的体积

关于tintMode:

在5.0以后咱们能够为 bitmap 是 9-patch 定义一个透明的遮罩。BitmapDrawable 和 NinePatchDrawable 运用 setTint()办法

而在xml文件中运用 android:tint 和 android:tintMode 这两个属性。

重视点:运用 android:tint 指定颜色时必定要带透明度。#50ff00ff便是说是8位的色值而不是6位的。

属性说明:

android:tint: 设置的是颜色

android:tintMode:设置的是类型(src_in,src_over,src_atop,add,screen,multiply)

类型说明:

src_in 只表示设置的遮罩颜色。 相当于遮罩在里面。

src_over 遮罩颜色和照片表示。相当于遮罩在照片上方。(尤其是色值带透明度的)

src_atop 遮罩在照片上方 multiply 混合色遮罩

screen add 混合遮罩,drawable颜色和透明度。

AnimatedVectorDrawable

AnimatedVectorDrawable 经过 ObjectAnimator 或 AnimatorSet 对 VectorDrawable 的某个属性作动画。

从API-25起始,AnimatedVectorDrawable 运行在 RenderThread(相反地,初期API是运行在UI线程)。这便是说 AnimatedVectorDrawable 在UI线程繁忙时能保持流畅运行。

倘若UI线程反应,RenderThread 会连续动画计算,直到UI线程有能力推进下一帧。因此呢办法准确地同步 RenderThread-enabled 的 AnimatedVectorDrawable 和UI线程中的 Animations。另外,Animatable2.AnimationCallback.onAnimationEnd(drawable)肯定会在 RenderThread 渲染完 AnimatedVectorDrawable 最后一帧时被调用。

AnimatedVectorDrawable 能够被定义在三个XML文件或一个XML中。

重点办法

代码中运用

更加多

每日学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每日都有好心情。

倘若你有好的技术文案想和大众分享,欢迎向我的公众号投稿,投稿详细细节请在公众号主页点击“投稿”菜单查看。

欢迎长按下图 -> 识别图中二维码扫一扫关注我的公众号:





上一篇:HTML 音频(Audio)
下一篇:【HTML 教程】多媒介标签
回复

使用道具 举报

3061

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139052
发表于 2024-10-19 17:15:43 | 显示全部楼层
楼主的文章非常有意义,提升了我的知识水平。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 11:00 , Processed in 0.186034 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.