简介: 可伸缩矢量图(Scalable Vector Graphics SVG)是一种基于 XML 的语言,用于绘制二维图形。不过,它的能力不局限于简单的静态矢量图形。本文展示了如何将交互元素加入到 SVG 文档中,使其可以对用户输入作出响应。
SVG 中的交互性可以分为三个领域 --链接、事件和脚本。本文将依次讨论这三个领域。
注意:要查看本技巧中的SVG 文档,需要有一个 SVG 查看程序,可以在 参考资料中找到这种查看程序(还有一个包括所有相关文件的.zip 文件)。
链接
最基本的交互形式是链接。在 SVG 中,通过一个 <a> 标签提供链接,这与HTML 链接的方式几乎相同。将 <a> 标签与一个 xlink:href 属性结合使用便可以建立一个链接。在 <a>和</a> 标签之间的所有内容都作为链接的一部分。清单1展示了一个例子,它有三个元素,设置为链接到三个不同的URL。 单击这里以在浏览器中查看它们。
文本、矩形和多边形元素都有到不同页面的链接,这表明所有SVG 元素 -- 不管是文本、圆还是不规则的多边形 --都可以作为一个链接。注意,如果将鼠标移动到这些元素上面,指针会相应地发生改变,表明这是一个链接。
其功能与 HTML 中的 image map(或者 hotspot)基本上相同。不过,在HMTL 中这会是一个很麻烦的过程,要用专门的软件在一个图像上手工绘制热点-- 如果这个图像或者链接改变了,那么更新它们会非常麻烦。在SVG 中,定义和维护链接则容易得多,这主要是因为链接可以随着SVG 内容动态移动。
清单1. 链接
<svg> <a xlink:href=/blog_article/"http_/www.w3.org/Graphics/SVG/Overview.htm8"> <rect x="10" y="10" width="100" height="30" rx="10" ry="10" style="fill:lightgrey"/> <text x="30" y="30" font-size="12">Click here</text> </a> <a xlink:href=/blog_article/"http_/www.ibm.com/developerworks/">/index.html <circle cx="100" cy="100" r="50" style="fill:grey"/> <text x="80" y="100" font-size="12">Or here</text> </a> <a xlink:href=/blog_article/"http_/www.ibm.com/"/index.html target="new"> <polygon points="60 160,165 172,180 60,290 290,272 280,172 285,250 255" style="fill:dimgrey"/> <text x="160" y="200" font-size="12">Or even here</text> </a> </svg>
注意在多边形的 xlink 中使用的 target=new 属性。它指示查看程序在单击这个元素时打开一个新的浏览器窗口。
回页首
事件
SVG 支持鼠标单击、鼠标移动和鼠标按下这样的用户鼠标事件。清单2展示了一个例子:
清单2. 使用鼠标的交互性
<svg> <rect x="10" y="10" width="140" height="140" rx="5" ry="5" style="fill:lightgrey"> <set attributeName="fill" from="lightgrey" to="red" begin="mouseover" end="mouseout"/> </rect> <text x="200" y="75" font-size="30">Move over me and click <set attributeName="font-size" from="30" to="35" begin="mouseover" end="mouseout"/> <set attributeName="fill" from="black" to="red" begin="mousedown" end="mouseup"/> </text> </svg>
单击这里以便观看效果。矩形和文本元素对不同的事件-- 如移动鼠标和单击 --做出反应,产生一种简单的滚动效果。试着将鼠标移动到元素上面以观看这些效果。任何可以应用到元素上的SVG 属性 --如填充颜色、笔划宽度、大小和透明度 -- 都可以以这种方式改变。
文字元素可以对两种事件做出反应 -- mouseover 和 mousedown 。这表明可以对同一个元素指定多个事件。SVG支持许多不同的事件-- 有关所有事件类型的完整列表可以参看 参考资料中的W3C 的 SVG 站点。
如果希望一个元素上的事件可以引发对另一个元素的操作,可以对 SVG 元素指定 id 属性,然后引用它们。清单3展示了一个例子。
清单3: 改变另一个元素的属性
<svg> <rect id="changeToRed" x="20" y="20" width="25" height="25" rx="5" ry="5" style="fill:lightgrey"/> <text x="50" y="35" font-size="14">Move over for red text</text> <rect id="bigText" x="20" y="60" width="25" height="25" rx="5" ry="5" style="fill:lightgrey"/> <text x="50" y="75" font-size="14">Move over for big text</text> <rect id="bigRedText" x="20" y="100" width="25" height="25" rx="5" ry="5" style="fill:lightgrey"/> <text x="50" y="115" font-size="14">Click me for big red text</text> <text id="changingText" x="250" y="100" font-size="30" fill="black">Change me <set attributeName="fill" from="black" to="red" begin="changeToRed.mouseover" end="changeToRed.mouseout"/> <set attributeName="font-size" from="14" to="50" begin="bigText.mouseover" end="bigText.mouseout"/> <set attributeName="font-size" from="14" to="50" begin="bigRedText.click" end="bigRedText.mouseout"/> <set attributeName="fill" from="black" to="red" begin="bigRedText.click" end="bigRedText.mouseout"/> </text> </svg>
单击这里可以在浏览器中观看效果。当鼠标移动到不同的矩形上时,文本就会改变。有三个矩形被指定了各自的 id 属性,文字的 set 元素通过“ id.eventName ”引用这些属性。触发矩形的事件时,文本的属性就会相应地改变。
还可以用一个动画响应事件。清单4展示了这样的一个例子:
清单4. 开始一个动画
2012年11月中旬,Google发布了Android 4.2。虽然它和Android 4.1同属Jelly Bean系列,但却添加了很多新的功能。其中,在显示部分,Android 4.2在Project Butter基础上再接再厉,新增了对Wi-Fi Display功能的支持。由此也导致整个显示架构发生了较大的变化。
本文首先介绍Wi-Fi Display的背景知识,然后再结合代码对Android 4.2中Wi-Fi Display的实现进行介绍。
一背景知识介绍Wi-Fi Display经常和Miracast联系在一起。实际上,Miracast是Wi-Fi联盟(Wi-Fi Alliance)对支持Wi-Fi Display功能的设备的认证名称。通过Miracast认证的设备将在最大程度内保持对Wi-Fi Display功能的支持和兼容。由此可知,Miracast考察的就是Wi-Fi Display(本文后续将不再区分Miracast和Wi-Fi Display)。而Wi-Fi Display的核心功能就是让设备之间通过Wi-Fi无线网络来分享视音频数据。以一个简单的应用场景为例:有了Wi-Fi Display后,手机和电视机之间可以直接借助Wi-Fi,而无需硬连线(如HDMI)就可将手机中的视频投递到TV上去显示[①]。以目前智能设备的发展趋势来看,Wi-Fi Display极有可能在较短时间内帮助我们真正实现多屏互动。
从技术角度来说,Wi-Fi Display并非另起炉灶,而是充分利用了现有的Wi-Fi技术。图1所示为Wi-Fi Display中使用的其他Wi-Fi技术项。
图1 Miracast的支撑体系结构
由图1可知,Miracast依赖的Wi-Fi技术项[②]有:
- Wi-Fi Direct,也就是Wi-Fi P2P。它支持在没有AP(Access Point)的情况下,两个Wi-Fi设备直连并通信。
- Wi-Fi Protected Setup:用于帮助用户自动配置Wi-Fi网络、添加Wi-Fi设备等。
- 11n/WMM/WPA2:其中,11n就是802.11n协议,它将11a和11g提供的Wi-Fi传输速率从56Mbps提升到300甚至600Mbps。WMM是Wi-Fi Multimedia的缩写,是一种针对实时视音频数据的QoS服务。而WPA2意为Wi-Fi Protected Acess第二版,主要用来给传输的数据进行加密保护。
上述的Wi-Fi技术中,绝大部分功能由硬件厂商实现。而在Android中,对Miracast来说最重要的是两个基础技术:
- Wi-Fi Direct:该功能由Android中的WifiP2pService来管理和控制。
- Wi-Fi Multimedia:为了支持Miracast,Android 4.2对MultiMedia系统也进行了修改。
下边我们对Miracast几个重要知识点进行介绍,首先是拓扑结构和视音频格式方面的内容。
Miracast一个重要功能就是支持Wi-Fi Direct。但它也考虑了无线网络环境中存在AP设备的情况下,设备之间的互联问题。读者可参考如图2所示的四种拓扑结构。
图2 Miracast的四种拓扑结构
图2所示内容比较简单,此处就不再详述。另外,在Wi-Fi Display规范中,还存在着Source将Video和Audio内容分别传送给不同Render Device的情况。感兴趣的读者可参考Wi-Fi Display技术规范。
另外,Miracast对所支持的视音频格式也进行了规定,如表1所示。
表1 Miracast 视音频格式支持
分辨率
17种 CEA格式,分辨率从640*480到1920*1080,帧率从24到60
29种VESA格式,分辨率从800*600到1920*1200,帧率从