1、静态显示

在FLEX应用程序中可以使用SVG资源, 但只能象JPG和GIF那样作为一种图像引入, 而不包括SVG的一些高级特性, 而且无法在运行时加载, 只能在编译时静态加载,所以图片的大小无法改变。

2、动态加载svg图片

Degrafa框架已经非常接近在FLEX中动态显示和操作SVG文档了,通过一些简单的转换, 基本上能够实现对SVG图形进行显示和操作。这样大量的SVG图形资源就可以直接在FLEX应用程序中使用了。

原理就是解析svg文件,然后通过flex生成图片。

第一步是遍历svg文件

/**
* 遍历svg文件
* @param node
*
*/
public function searchPath( node:XML ):void
{
if(node.name().toString().indexOf("::svg")>-1){
for each ( var attr:XML in node.attributes() )
{
if(attr.name().toString()=="width"){
defaultWidth=Number(attr.toString().replace("px",""));
}else if(attr.name().toString()=="height"){
defaultHeight=Number(attr.toString().replace("px",""));
}
}
tempScaleX=tempParams.width/defaultWidth;
}
// Loop over all of the child elements of the node
for each ( var element:XML in node.elements( ) )
{
if(element.name().toString().indexOf("::g")>-1)
{
for each ( var element1:XML in element.elements() ){
if(element1.name().toString().indexOf("::text")>-1||element1.name().toString().indexOf("::path")>-1)
{
var objSVG1:SvgPath=new SvgPath(element1,surface,red);
objSVG1.show(tempScaleX)
}
}
//newPath.show();
}else if(element.name().toString().indexOf("::path")>-1){
var objSVG:SvgPath=new SvgPath(element,surface,red);
objSVG.show(tempScaleX)
}else if(element.name().toString().indexOf("::rect")>-1){
for each ( var attr1:XML in element.attributes() )
{
if(attr1.name().toString()=="width"){
defaultWidth=Number(attr1.toString().replace("px",""));
}else if(attr1.name().toString()=="height"){
defaultHeight=Number(attr1.toString().replace("px",""));
}
}
}
}

然后是解析属性,并添加事件

/**
* 构造方法
* @param element
* @param container
* @param red
*
*/
public function SvgPath(element:XML,container:Surface,red:SolidFill):void
{
redFill=red;
surface=container;
for each ( var attr:XML in element.attributes() )
{
//Alert.show(attr.name().toString()); switch(attr.name().toString())
{
case "id":
id = attr.toString();
//Alert.show(id);
break; case "d":
data = attr.toString();
break; case "fill":
fillColor = attr.toString();
break; case "fill-opacity":
fillAlpha = Number(attr.toString());
break; case "stroke":
strokeColor = attr.toString();
break; case "stroke-opacity":
strokeAlpha = Number(attr.toString());
break; case "stroke-width":
strokeWidth = Number(attr.toString());
break; case "transform":
transformStr = attr.toString();
break; case "style":
style = attr.toString();
break;
case "font-family":
fontFamily = attr.toString();
break;
case "font-size":
fontSize = Number(attr.toString());
break; default:
break;
}
text=element.text();
} if(id == null)
id = "Path_" + (Math.random()*1000000).toString(); //if(style != null) //style on high priority
//setByStyle();
}
/**
* 鼠标点击事件
* @param event
*
*/
public function onClickGroup2(event:MouseEvent):void
{
var id:String="";
if(event.target is GeometryGroup){
id=String(event.target.id).split("@")[0];
}else{
id=String(event.target.parent.parent.id).split("@")[0];
}
ExternalInterface.call("showDetail",id);
}
/**
* 鼠标覆盖事件
* @param event
*
*/
private function onOverGroup(event:MouseEvent):void
{ var gouopKey:String="";
if(event.target is GeometryGroup){
gouopKey=String(event.target.id).split("@")[1];
}else{
gouopKey=String(event.target.parent.parent.id).split("@")[1];
}
var tempGroup:GeometryGroup=SVGHelp.groupMap[gouopKey];
tempfill=tempGroup.geometryCollection.getItemAt(0).fill;
tempGroup.geometryCollection.getItemAt(0).fill=redFill;
}
/**
* 鼠标移除事件
* @param event
*
*/
private function onOutGroup(event:MouseEvent):void
{ var gouopKey:String="";
if(event.target is GeometryGroup){
gouopKey=String(event.target.id).split("@")[1];
}else{
gouopKey=String(event.target.parent.id).split("@")[1];
}
var tempGroup:GeometryGroup=SVGHelp.groupMap[gouopKey];
tempGroup.geometryCollection.getItemAt(0).fill=tempfill;
tempfill=null;
} /**
* 获取solidFill
* @return
*
*/
protected function getFillObject():SolidFill
{ var newSolidFill:SolidFill = new SolidFill();
newSolidFill.id = "SolidFill" + id; if(fillColor == null){
newSolidFill.color = null;
} else{
newSolidFill.color = Number("0x" + fillColor.substr(1));
} surface.fillCollection.addItem(newSolidFill); return newSolidFill;
} /**
* 获取SolidStroke
* @return
*
*/
protected function getStrokeObject():SolidStroke
{
var newSolidStroke:SolidStroke = new SolidStroke();
newSolidStroke.id = "SolidStroke_" + id;
newSolidStroke.alpha = 0.5;
newSolidStroke.weight = strokeWidth; if(strokeColor == null){
newSolidStroke.color = null;
}else{
newSolidStroke.color = Number("0x" + strokeColor.substr(1));
} surface.strokeCollection.addItem(newSolidStroke); return newSolidStroke;
} /**
* 获取偏移数据
* @return Matrix
*
*/
protected function getTransformMatrix():Matrix
{
if(transformStr == null){
return null;
} if(transformStr.substr(0, 6)!="matrix"){
return null;
} var startIndex:int = transformStr.indexOf("(");
var endIndex:int = transformStr.indexOf(")"); var str:String = transformStr.substr(startIndex + 1, endIndex - startIndex - 1); var matrixData:Array = str.split(" ");
var matrix:Matrix = new Matrix();
matrix.a=matrixData[0];
matrix.b=matrixData[1];
matrix.c=matrixData[2];
matrix.d=matrixData[3];
matrix.tx=matrixData[4]-5;
matrix.ty=matrixData[5]; return matrix;
}

最后组装成图片

/**
* 生成并显示图片
*
*/
public function show(tempScaleX:Number):void
{
try
{
var group:GeometryGroup = new GeometryGroup(); group.id =id;
if(text!=""){
var matrix:Matrix = getTransformMatrix();
var tttxt:TextField=new TextField();
tttxt.text=text;
//tttxt.textColor=; var format:TextFormat = new TextFormat();
format.size = 18/(2*tempScaleX-tempScaleX*tempScaleX);
format.font=fontFamily;
tttxt.setTextFormat(format);
tttxt.width=25*tttxt.length/(2*tempScaleX-tempScaleX*tempScaleX);
tttxt.height=28/(2*tempScaleX-tempScaleX*tempScaleX);
group.addChild(tttxt);
group.mouseEnabled=false;
group.mouseChildren=true;
group.buttonMode=true;
SVGHelp.groupMap[id.split("@")[1]].addChild(group);
if(matrix != null){
group.transform.matrix = matrix;
}
}else{
group.target = surface;
surface.graphicsCollection.addItem(group);
//Create new objects
var dgfObject:Path = new Path(null);
dgfObject.id = id;
dgfObject.data = data;
dgfObject.fill = getFillObject();
dgfObject.stroke = getStrokeObject();
group.geometryCollection.addItem(dgfObject);
SVGHelp.groupMap[id.split("@")[1]]=group;
group.addEventListener(MouseEvent.CLICK,onClickGroup2);
group.addEventListener(MouseEvent.ROLL_OVER,onOverGroup);
group.addEventListener(MouseEvent.ROLL_OUT,onOutGroup);
group.mouseChildren=true;
group.buttonMode=true;
}
}
catch(error:Error)
{
Alert.show(error.message);
}
}

Flex动态加载svg图片的更多相关文章

  1. Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子

    Delphi7 第三方控件1stClass4000的TfcImageBtn按钮控件动态加载jpg图片例子 procedure TForm1.Button1Click(Sender: TObject); ...

  2. Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片

    Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在edge ...

  3. 关于Unity3D中Resources动态加载NGUI图片的方法

    在NGUI中有些图片我需要动态进行变更或者加载,怎么办? 首先在项目中创建一个Resources目录,接着把需要的图片放在这里面,可以有子文件夹么?当然可以,文件结构很重要哦~ NGUI加载图片的方法 ...

  4. vue如何动态加载本地图片

    大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我(全网同名),解锁前端成长新姿势. 以下正文: 今天遇到一个在vue文件中引入本地图片的问题,于是有了这篇文章. 通常,我们的一个im ...

  5. 页面滚动图片等元素动态加载插件jquery.scrollLoading.js

    如果一个网页很长,那么该页面的加载时间也会相应的较长.而这里给大家介绍的这个jQuery插件scrollLoading的作用则是,对页面元素进行动态加载,通俗的说就是滚到哪就加载到哪,屏幕以下看不见的 ...

  6. APP动态加载轮播图片

    如果APP里面的轮播图片是动态加载的话,那么你会发现他不会轮播(前提是mui框架),这里都是用的mui框架,动态加载的图片因为mui的js查不到html上面没有图片,所以就不会轮播,需要手动重置下轮播 ...

  7. 【MFC】picture控件 两种有细微差别的动态加载图片方法

    摘自:http://www.jizhuomi.com/software/193.html VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) 分类标签: 编程入门 ...

  8. vue中require动态加载图片

    <template> <img src="D:/images/01.png" alt="静态加载"> <img :src=&quo ...

  9. Unity www动态加载网上图片

    一. 1.新建一个UGUI的Button,删掉它的Image组件,添加一个Raw Image组件.如图: 由于删除了Image组件,所以画圈的位置是空的,运行后会自动把Raw Image添加到那里. ...

  10. Unty3D动态加载图片

    试验动态加载图片,代码如下: using UnityEngine; using System.Collections; public class DynamicLoad : MonoBehaviour ...

随机推荐

  1. DotNet Web应用单文件部署系列

    目录 一.    pubxml文件配置 二.    打包wwwroot文件夹 三.    混淆dll文件 四.    csproj文件配置 五.    批处理 六.    Windows服务安装 七. ...

  2. python 二次封装logging,打印日志文件名正确,且正确写入/结合pytest执行,日志不输出的问题

    基于之前日志问题,二次封装日志后,导致日志输出的文件名不对,取到的文件一直都是当前二次封装的log的文件名,基于这个问题,做了优化,详细看 https://www.cnblogs.com/cuitan ...

  3. airflow(二)集成EMR使用

    1. 准备工作 1.1. 安装并初始化airflow,参考以下文档: https://www.cnblogs.com/zackstang/p/11082322.html 其中还要额外安装的是: sud ...

  4. .NET 个人博客-给文章添加上标签

    个人博客-给文章添加上标签 优化计划 置顶3个且可滚动或切换 推荐改为4个,然后新增历史文章,将推荐的加载更多放入历史文章,按文章发布时间降序排列. 标签功能,可以为文章贴上标签 推荐点赞功能 本篇文 ...

  5. 在Linux应用层使用POSIX定时器

    在Linux应用层使用POSIX定时器 ref : http://blog.chinaunix.net/uid-28458801-id-5035347.html http://blog.sina.co ...

  6. 使用EF 连接 数据库 SQLserver、MySql 实现 CodeFirst

    1.新建项目,下载Nuget安装包 创建项目需要注意几点,如果是基于 .net framework 的项目 需要选择 相应版本的 EF, 如果是跨平台则选择EF Core版本. 我这里选择的是 .ne ...

  7. Centos 下Rabbit MQ 常用操作指令 汇总

    1.rabbitmq 服务的启动停止. service rabbitmq-server start service rabbitmq-server stop 重启命令需要依次执行 stop 再 sta ...

  8. day02模板与配置

    一.WXML模板语法 1.1 数据绑定 绑定内容 跟vue差不多,在页面的js文件定义到data里面 然后通过插值语法用在wxml中即可 绑定属性 直接写上插值语法,没有: 三元运算 生成一个十以内的 ...

  9. 移动web布局方法

    继续更新移动端的一个布局,这也是经典中的经典,当初只知道个rem和vwvh适配,其实这里面还有很多的门道不只是一个适配这么简单 一.前置 1.背景缩放 我们都知道做移动端,给的图都是二倍图,你拿来用直 ...

  10. .Net Core WebApi 使用 JWT 验证身份

    .h2 { background-color: rgba(78, 110, 242, 1); color: rgba(255, 255, 255, 1); padding: 10px } 一.注册身份 ...