显示解析svg

g公司代码显示svg:

SVGParserRenderer drawable = new SVGParserRenderer(context, String svgContent);

String svgContent = <?xml version="1.0" encoding="utf-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"width="48px" height="48px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" xml:space="preserve">
<path fill="#B0B0B0" d="M3.494,24c0-0.587,0.476-1.063,1.063-1.063h38.886c0.588,0,1.063,0.476,1.063,1.063l0,0
    c0,0.587-0.475,1.062-1.063,1.062H4.557C3.97,25.063,3.494,24.587,3.494,24L3.494,24z"/>
<g><g><g>
<path fill="#B0B0B0" d="M3.806,23.249c0.415-0.414,1.088-0.414,1.502,0l17.054,17.053c0.415,0.415,0.415,1.087,0,1.503l0,0
                c-0.415,0.414-1.088,0.414-1.503,0L3.806,24.751C3.391,24.336,3.391,23.665,3.806,23.249L3.806,23.249z"/>
</g><g>
<path fill="#B0B0B0" d="M22.361,6.196c0.415,0.415,0.415,1.087,0,1.502L5.308,24.751c-0.414,0.415-1.087,0.415-1.502,0l0,0
                c-0.415-0.415-0.415-1.087,0-1.503L20.858,6.196C21.273,5.781,21.946,5.781,22.361,6.196L22.361,6.196z"/>
</g></g></g>
</svg>

(SVGView )mSvgView.setSVGRenderer(drawable, null);

<com.trevorpage.tpsvg.SVGView
    android:id="@+id/siv_topicon"
    android:layout_width="@dimen/abs__shortcut_svg_size"
    android:layout_height="@dimen/abs__shortcut_svg_size"
    android:layout_gravity="center"
    >
</com.trevorpage.tpsvg.SVGView>

public class SVGView extends View {}
public class SVGParserRenderer extends DefaultHandler {}

SVGView.setSVGRenderer(SVGParserRenderer, null);

SVG的解析:

二、SVG的解析

上文提到Android5.0时引入了SVG特性,其中必然会涉及到SVG图片的加载与解析。而svg本质上就是xml文件,所以从解析角度来看,能解析xml文件的工具应该几乎都可以用来解析svg文件。 
1、DOM解析 
查看Android源码可以看出,5.0引入svg后并没有使用dom进行解析svg源文件,虽然svg号称完全支持dom标准。笔者从dom解析的过程可以看出,Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件。虽然一般情况下,svg文件是比较小的,但也不乏有些很复杂的图片会上升到M级别,如果在解析时需要全部载入,对于Android系统来说时比较耗时的,这也许就是dom遭Android淘汰的原因之一吧。 
2、SAX解析 
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用 
3、PUll解析 
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像 SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使 用,Android系统内部在解析各种XML时也是用PULL解析器

三、SVG在Android5.0以上版本中的使用

1、使用方法 
鉴于SVG有那么多的优点,Android于5.0版本将该特性引入。在5.0以上版本中使用方法如下: 
1)获取SVG图片数据 
第一种方法当然是从网上down了(一般直接用来测试使用),这里只给出几个常用素材下载网站: 
http://sc.chinaz.com/ 
http://www.freevectors.net 
http://www.freevectordownload.com/ 
其次就是手工制作了:真正做项目时,方法1肯定满足不了相应的需要了。这时我们只能自己动手来作图了(应该是美工来负责^_^||),相应最常用的软件就是PS、AI或者CDR也可以。具体制作方法这里就不做介绍了,直接上网搜就行。这里给出一个较为详细的例子:http://blog.csdn.net/tianjian4592/article/details/44733123 
2)将普通SVG图片数据转换成Android可用数据 
一般的SVG图片数据是直接在html或jsp中可以使用,Android中若想使用svg则需要中间环节先转换成Vector标签包括的xml文件(如果做动画的话,外面还需要包括一层animated-vector来引用vector资源),其中最重要的就是path元素,该元素就是图片加载显示过程中的绘制轨迹。具体转换方法网上查询得出有两种:一是手动改写,二是直接使用自动转化工具转换(http://inloop.github.io/svg2android/)。具体转换规则以及相应符号意义可以参见:http://www.w3.org/TR/SVG11/paths.html#PathData
3)在工程中使用 
svg在5.0以上的Android工程中使用相对较为简单,直接用drawable控件(如mageView等)引用第二步中转换得来的xml文件资源即可。 
2、Demo实例 
实例一:mytest(使用Drawable控件引用5.0新特性vector资源) 
【关键代码摘要】 
使用vector标签包括path元素 
[ sharp_rect.xml ]

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

    <path
        android:name="sharp_rect"
        android:fillColor="#000000"
        android:pathData="M 320,180 L 0,320 0,0 180,0 z" />
</vector>

使用ImageView引用vector资源sharp_rect 
[ activity_main.xml ]

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <ImageView
        android:src="@drawable/sharp_rect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</RelativeLayout>

Demo附件: mytest.zip 
效果图: 

实例二:【VectorCard】使用5.0新特性animated-vector标签引用xml中的svg path元素 
【关键代码摘要】 
[ to_stop.xml ]

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="500"
                android:interpolator="@android:interpolator/decelerate_cubic"
                android:propertyName="pathData"
                android:valueType="pathType"
                android:repeatMode="reverse"
                android:repeatCount="1"
                android:valueFrom="M100,100 L400,250 L100,400 L100,400 z"
                android:valueTo="M100,100   L400,100 L400,400 L100,400 z" />

[ animated_play.xml ]

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
                 android:drawable="@drawable/play_icon">
    <target
        android:animation="@animator/to_stop"
        android:name="play" />
</animated-vector>

Demo附件: app.zip 
效果图: 

3、小结 
Android5.0关于这块新特性的添加主要是依赖于Vctor,对应的类为VectorDrawable以及AnimatedVectorDrawable。前者主要用于矢量图的加载,后者主要用于矢量动画的加载。二者在使用过程中要区分对待。

四、Android5.0以下使用SVG探索总结

经过这短时间的不断摸索与实验,按照svg_android组织的方法主要有以下两种: 
1、基于svg_android库 
抽取类似svg_android库中适合5.0以下的,且可以解析svg的Java文件,自定义类似svg的控件,进行Android工程的搭建(该实例使用sax解析svg文件)。 
对应实例:【SVGMapView-master】 
Demo附件: SVGMapView-master.zip 
效果图: 

【说明】 该方法需要开发者自己去重写解析函数,目前该实例并不能支持所有的svg语法的解析,如将该方法布置到项目中,需要大量拓展解析甚至加载SVg的功能函数。 
2、基于JNI技术 
加载及加息svg的工作交给C/C++处理,上层使用java调用对应.so库暴露的接口。 
对应实例:【ImageViewSvg】 
Demo附件: ImageViewSvg.zip 
效果图: 

【说明】该方案虽然使用了JNI技术来加载并解析svg文件,但目前其解析度有限,功能较为单一,如需要布置该方案于项目中,对于jni侧也需要扩展大量的svg解析函数。且需要优化对应的加载处理环节。

五、总结

从整体上看,目前是有可能将svg应用到Android5.0以下版本的。但其的稳定性,以及后续的工作量是需要我们仔细斟酌的问题之一。

时间: 2024-10-16 18:57:20

显示解析svg的相关文章

Error: postcss-svgo: Error in parsing SVG: Unquoted attribute value 无法解析svg

把SVG用双引号包起来 background-image: url("data:image/svg+xml;charset=utf-8,\"<svg viewBox=\'0 0 120 120\' xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\'><defs><line id=\'l\' x1=\'60\' x2=\'60\' y1=\'7\'

UWP 手绘视频创作工具技术分享系列 - SVG 的解析和绘制

本篇作为技术分享系列的第一篇,详细讲一下 SVG 的解析和绘制,这部分功能的研究和最终实现由团队的 @黄超超 同学负责,感谢提供技术文档和支持. 首先我们来看一下 SVG 的文件结构和组成 SVG (Scalable Vector Graphics) 是一种可缩放矢量图形,使用 XML 格式来定义,是一种 W3C 标准,图像在放大或改变尺寸的情况下其图形质量不会有所损失. 下面是一个简单的 SVG 的文件结构例子: <?xml version="1.0" standalone=&

SVG 与 Canvas:如何选择

SVG 与 Canvas:如何选择 61(共 69)对本文的评价是有帮助 - 评价此主题 本主题一开始将对 SVG 与 Canvas 进行简要比较,接下来会讨论大量的比较代码示例,如光线跟踪和绿屏. 注意  为了查看本主题中包含的很多示例,你必须使用支持 SVG 和 Canvas 元素的浏览器(如 Windows Internet Explorer 9). 简介 矢量图形 矢量图形方案的简要概述 专业设计器和使用工具 HTML5 图形技术 技术简介 何时使用 <canvas>.何时使用 SVG

关于Android中使用SVG特性的探索与总结

前言 引入SVG还需要从图片的数字化说起.一般来说,将图片存储为数据有两种方案.其一.就是我们传统使用的位图(光栅图).即将图片看成在平面上密集排布的点的集合.每个点发出的光有独立的频率和强度,反映在视觉上,就是颜色和亮度.位图拥有一个庞大的家族,包括常见的JPEG/JPG, GIF, TIFF, PNG, BMP等.第二种方案就是矢量图(SVG就是其中的一种).它用抽象的视角看待图形,记录其中展示的模式而不是各个点的原始数据.它将图片看成各个"对象"的组合,用曲线记录对象的轮廓,用某

Gprinter光栅位图点阵数据解析工具

最近参与的项目有一个需求,解析佳博热敏打印机的光栅位图点阵数据并保存为图片文件.数据是通过Bus Hound抓取的,如下图所示. 其中1b 40为初始化打印机的指令,对应的ASCII码为ESC @,1b 4a 18为打印并走纸的指令,对应的ASCII码为ESC J,1d 76 30为打印光栅位图的指令,对应的ASCII码为GS v 0,其后紧跟光栅位图模式(0x00).水平方向位图字节数(0x0036)和垂直方向位图点数(0x0018),后面则为本帧的位图数据(0x36*0x18=1296字节)

iOS开发2-使用SAX解析XML数据

XML数据结构和解析 1.1XML数据结构 XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可分类的信息.创建的文件,或文档实例 由元素(标记)和内容构成.当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档.元素的描述性越强,文档各部分越容易识别.自从出现标记至今,带有标记的内容就有一个优势,即在计算机系统缺失时,仍然可以通过标

Android APK瘦身大法——SVG图片瘦身

前两天和上家公司的上司无意聊了聊工作的事,也就顺便扯到了apk瘦身上.主要是通过SVG进行图片压缩来减少app的大小.下面我就详细介绍一下如何实现SVG的图片压缩. SVG的优点 SVG 可被非常多的工具读取和修改(比如记事本),由于使用xml格式定义,所以可以直接被当作文本文件打开,看里面的数据: SVG 与 JPEG 和 GIF 图像比起来,尺寸更小,且可压缩性更强,SVG 图就相当于保存了关键的数据点,比如要显示一个圆,需要知道圆心和半径,那么SVG 就只保存圆心坐标和半径数据,而平常我们

【转】【翻译】对响应式SVG的再思考

来源: http://www.w3ctech.com/topic/1555 原文地址:http://www.smashingmagazine.com/2014/03/rethinking-responsive-svg/ 如果你还未曾见过乔•哈里森响应式图标http://responsiveicons.co.uk/的技术,那你很可能会像我第一次看到它时一样,对它印象深刻.在这篇文章中,我想探究一下,我们该如何使用SVG来做一些更有趣的事情,而不只是作为“可伸缩矢量图形”来对PNG位图进行替换.事实

SVG的用法

转载于   http://www.webhek.com/post/svg.html <如何画出一条会动的线>这篇文章专门介绍了上面这SVG动画是如何简单的实现的. SVG是一种矢量图格式.SVG是Scalable Vector Graphics三个单词的首字母缩写.Adobe Illustrator是专门编辑.制作矢量图的软件工具.SVG是Adobe Illustrator的主要制作目标.你可以在轻松的网页上使用漂亮的SVG图,但SVG有很多的用法你可能还不知道. 观看演示 SVG有什么优势?