公司--下载svg图片
加载本地svg图片:
SVGParserRenderer norDrawable =
OtherPageConfigsManager.getInstance().getSVGParserRenderer(this,map.get("iconUrlNor")); public SVGParserRenderer getSVGParserRenderer(Context context, String svgPath){
String config = "";
if(iconLoadPathType == SAVE_TYPE_ASSETS)//本地存储位置
config = FileSystem.getFromAssets(context, "panelConfigFolder/"+svgPath);
else if(iconLoadPathType == SAVE_TYPE_SDCARD)//SDK存储位置
config = "";//"file://"+FileSystem.getCacheRootDir(context, "").getPath()+ url;
else if(iconLoadPathType == SAVE_TYPE_SYSTEM_DATA_FOLDER)//内部文件系统存储位置
//modify by chris.lei 添加中台未配发右侧在线客服图标导致从内部文件中读取不到信息客户端首页显示空白的问题
config = FileSystem.readFromFile(context,
getConfigFile(context, "panelConfigFolder", svgPath).getPath());
if(config == ""){
config = FileSystem.getFromAssets(context, "panelConfigFolder/"+svgPath);
}
return SvgRes1.getSVGParserRenderer(context, config);//从配置文件获取
} public static SVGParserRenderer getSVGParserRenderer(Context context, String svgContent) {
return svgContent != null && !svgContent.equals("")?new SVGParserRenderer(context, parseCssStyleToSvg(svgContent)):null;
} public static String parseCssStyleToSvg(String svgContent) {
int startIndex = svgContent.indexOf("<style");
int endIndex = svgContent.indexOf("</style>") + "</style>".length();
String styleStr = null;
if(startIndex >= 0 && endIndex >= 0) {
styleStr = svgContent.substring(startIndex, endIndex); // styleStr = <style type="text/css"><![CDATA[.strokeColor{fill:#B0B0B0;}]]></style> if(styleStr != null && !styleStr.equals("")) {
int startIndex1 = styleStr.indexOf(".");
int endIndex1 = styleStr.lastIndexOf(".");
int endendIndex = styleStr.lastIndexOf(";}") + ";}".length();
String colorStr;
if(startIndex1 == endIndex1) {
colorStr = styleStr.substring(startIndex1 + ".".length(), endendIndex);
} else {
colorStr = styleStr.substring(startIndex1, endendIndex);
}
//colorStr = strokeColor{fill:#B0B0B0;}
String[] fillColorArr = colorStr.split(";");
if(fillColorArr != null) {
for(int i = 0; i < fillColorArr.length; ++i) {
if(fillColorArr[i].contains("fill:")) {
String[] nameColorArr = fillColorArr[i].split("fill:");
if(nameColorArr != null) {
int nameStartIndex = nameColorArr[0].indexOf(".") + ".".length();
String name = nameColorArr[0].substring(nameStartIndex, nameColorArr[0].length() - 1);
String color = nameColorArr[1];
if(svgContent.contains("class=\"" + name + "\"")) {
svgContent = svgContent.replace("class=\"" + name + "\"", "fill=\"" + color + "\"");
}
}
}
}
}
} svgContent = svgContent.replace(styleStr, "");
} return svgContent;
} parseCssStyleToSvg的行参 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">
<style type="text/css">
<![CDATA[
.strokeColor{fill:#B0B0B0;}
]]>
</style>
<path class="strokeColor" 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 class="strokeColor" 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 class="strokeColor" 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> 返回 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>
下载网络svg图片:
if (norDrawable == null) {
panelConfigsDownloader.startDownloadForSvgIcon(this,
OtherPageConfigsManager.getInstance(),
map.get("downloadUrl") + norFilePath, saveNorFilePath,
new SvgIconOnDownloadCompleteListener(
mKdsShortcutView[index], map, "iconUrlNor"));
}
public void startDownloadForSvgIcon(Context context,ConfigsManager configsManager,String svgDownloadUrl,
String svgFilePath,
OnDownloadCompleteListener onDownloadCompleteListener){
//下载配置文件
String parentFolder = configsManager.mConfigInfo.saveFolderName+"/"; //parentFolder = panelConfigFolder/
String fileName = "";
if(svgFilePath != null && !svgFilePath.equals("")){ //svgFilePath = ueditor/1431988818264.svg
String[] saveFileDir = svgFilePath.split("/");
for(int i = 0; i < saveFileDir.length; i++){
if(saveFileDir[i].contains(".")){
fileName = saveFileDir[i]; //fileName = 1431988818264.svg
continue;
}
parentFolder += saveFileDir[i]; //parentFolder = panelConfigFolder/ueditor
}
}else{
return;//说明不是需要下载的文件
}
File file = configsManager.getConfigFile(context, parentFolder, fileName); //file = panelConfigFolder/ueditor/1431988818264.svg
DownloadConfigFileThread downloadConfigFileThread =
new DownloadConfigFileThread(context, svgDownloadUrl, file,
onDownloadCompleteListener);
if(!file.isDirectory() && !file.exists()) {//考虑已经存在同样名字的文件或者目录,
//Logger.d("downloadConfigFile", "startDownloadForSvgIcon exists:"+file.exists());
downloadConfigFileThread.start();//开始下载
}else{
Logger.i("快捷按钮配置文件", "警告:该文件存在相同文件名,不进行下载更新,请知晓!");
downloadConfigFileThread.onDownloadComplete();//已经存在也视为完成
}
}
public class DownloadConfigFileThread extends Thread
{
public synchronized void run()
{
try
{
URL url = new URL(downurl);// http://113.78.134.110:21800/api/config/app/ui/otherpage/online/66099/100000
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.connect();
// 获取文件大小
int length = conn.getContentLength();//40674
// 创建输入流
InputStream is = conn.getInputStream();
//处理文件路径不存在的问题
String dirFilePath = configFile.getPath();// /data/data/dongzheng.szkingdom.android.phone/files/panelConfigFolder/otherpage_temp.json
String childDirPath = "";
String[] path = dirFilePath.split("/");
for(int i = 0; i < path.length-1;i++){
if(path[i].contains("."))
continue;
childDirPath += "/" + path[i];
File file = new File(childDirPath);
if(!file.exists()) {//考虑已经存在同样名字的文件或者目录,
Logger.d("tag", "DownloadConfigFileThread mkdir newPath:"+file.getPath());
file.mkdir();
file.setExecutable(true, false);
file.setReadable(true, false);
file.setWritable(true, false);
}
}
FileOutputStream fos = new FileOutputStream(configFile); // 输出到文件 /data/data/dongzheng.szkingdom.android.phone/files/panelConfigFolder/otherpage_temp.json
// 缓存
byte buf[] = new byte[1024];
int count = 0;
// 写入到文件中
do
{
int numread = is.read(buf);
count += numread;
// 计算进度条位置
int progress = (int) (((float) count / length) * 100);
float tempSpace = count / 1024.0f / 1024.0f;
String downloadSpace = "";
try{
downloadSpace = String.format("%.3f",tempSpace)+"M";// > 1.0f ? (tempSpace+"M") : (count / 1024.0f+"KB");
}catch(Exception e){
}
if (numread <= 0)
{
//下载完成
mHandler.removeMessages(0);
Message msg = Message.obtain();
msg.what = 0;
mHandler.sendMessage(msg);
break;
}
// 写入文件
fos.write(buf, 0, numread);
} while (true);// 点击取消就停止下载.
fos.close();
is.close();
}catch(Exception e){
mHandler.removeMessages(1);
mHandler.sendEmptyMessage(1);
//e.printStackTrace();
}
}
}
公司--下载svg图片的更多相关文章
- Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片
Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在edge ...
- svg图片在vue脚手架vue-cli怎么使用
第一种 使用vue2-svg-icon npm install vue2-svg-icon --save-dev` 下载之后在mian.js引入 名字可以随便起,这里我起icon 引入svg资源 这时 ...
- 使用在线编辑 svg 软件修改 svg 图片
网站需要使用图标字体,但设计师给的图标大小有问题,故使用下面说陈述方法简单修改了一下.使用到的在线编辑软件地址为:https://editor.method.ac/ 问题: 注:至于如何使用图标字体( ...
- C#/VB.NET 将SVG图片添加到PDF、转换为PDF
以下内容介绍在C# 程序中如何将SVG图片添加到PDF文档.以及如何将SVG图片转换为PDF文档. 一.环境准备 先下载PDF类库工具,Spire.PDF for .NET hotfix 6.5.6及 ...
- C#获取网页的HTML码、下载网站图片、获取IP地址
1.根据URL请求获取页面HTML代码 /// <summary> /// 获取网页的HTML码 /// </summary> /// <param name=" ...
- 批量下载网站图片的Python实用小工具
定位 本文适合于熟悉Python编程且对互联网高清图片饶有兴趣的筒鞋.读完本文后,将学会如何使用Python库批量并发地抓取网页和下载图片资源.只要懂得如何安装Python库以及运行Python程序, ...
- [记录][python]python爬虫,下载某图片网站的所有图集
随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集 ...
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...
- php 下载远程图片 的几种方法(转)
1.获取远程文件大小及信息的函数 function getFileSize($url){ $url = parse_url($url); if($fp = @fso ...
随机推荐
- 【Cocos2d-x】坐标系和图层
在Cocos2D-X中,存在四种坐标系: 1.OpenGL坐标系:该坐标系原点在屏幕左下角.x轴向右,y轴向上.这也就是cocos2dx中用到的坐标系所以没啥好说的. 2.屏幕坐标系(UIKit坐标) ...
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...
- 为代码减负之<三>视图(SQL)
在设计数据库时为了降低数据冗余.一般都会依照三范式去设计,但有时我们在查询时须要通过一字段获取跟这 个字段相关联的好几个字段.可是他们又分布在不同的表中,这时候假设依照正常途径走的话须要同一时候查询好 ...
- 串口之CreateFile 函数具体解释
HANDLE CreateFile( LPCTSTR lpFileName, //指向文件名称的指针 DWORD dwDesiredAccess, //訪问模式(写/读) DWORD dwShareM ...
- tensorflow利用预训练模型进行目标检测(二):预训练模型的使用
一.运行样例 官网链接:https://github.com/tensorflow/models/blob/master/research/object_detection/object_detect ...
- ios 中生成随机数
ios 有如下三种随机数方法: 1. srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; 2. s ...
- Xcode的一些控制台命令
命令 解释 break NUM 在指定的行上设置断点 bt 显示所有的调用栈帧,该命令可用来显示函数的调用顺序 clear 删除设置在特定源文件.特定行上的断点,其用法为:clear FILENAME ...
- POJ 3150 循环矩阵的应用
思路: 首先 先普及一个性质: 循环矩阵*循环矩阵=循环矩阵 由于此题是距离小于d的都加上一个数. 那么 构造矩阵的时候 我们发现 诶呦 这是个循环矩阵 看看数据范围 n^2log(k)可以过. 那就 ...
- MySQL高级查询和编程基础
第一章 数据库设计 一.数据需求分析: 数据需求分析是为后续概念设计和逻辑结构设计做准备. 结构:(1)对现实世界要处理的对象进行详细的调查. (2)收集基础数.据. (3)对所收集的数据进行处理. ...
- CommandType.Text
CommandType.Text代表执行的是SQL语句CommandType.StoreProcedure代表执行的是存储过程CommandType代表要执行的类型 //返回DataTable的SQL ...