Android Volley 显示 SVG 图片
Android Volley display SVG image
在我的 Android 应用程序中,我从我的网站下载文本内容并将其存储在我的 mysql 数据库中。现在我想从同一个网站下载和缓存图像。使用 AndroidVolley 的 <com.android.volley.toolbox.NetworkImageView
,下载普通图片效果很好。但我想下载 SVG 矢量图像,缓存它们并显示在我的应用程序中。到目前为止,这在 Android Volley...
中是不可能的
我已经尝试使用 AndroidVolley 作为字符串下载 SVG,然后将它们放入 svg-android 元素 (See here),但是 svg-android 从来没有展示过我的形象。它似乎无法显示 Inkscape 创建的 SVG...
有谁知道一种简单的方法,如何下载这些文件并将它们显示在视图中?
谢谢
// 更新 27.3.2015 //
所以这是我的解决方案:
使用 Android Volley,我设置了 StringRequest
以将我的 SVG 图像作为字符串访问。 AndroidSVG 库(不要与 svg-android 库混淆)可以将此字符串转换为 SVG 对象并将其放入 SVGImageView
-View 中。这是一个示例代码它是如何工作的:
StringRequest stringRequest = new StringRequest("http://******/image.svg",new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
SVG svg = SVG.getFromString(response);
View view = getView();
if(view != null){
SVGImageView target = (SVGImageView)view.findViewById(catID);
target.setSVG(svg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(Globals.TAG,"Fehler "+error);
}
});
RequestQueue queue = Volley.newRequestQueue(mContext);
stringRequest.setShouldCache(true);
queue.add(stringRequest);
非常感谢!
您可以尝试两件事:
1.使用svg-android
库,需要设置
imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
使其发挥作用。
2.如果第一种方法不行,你可以试试SVGImageView
.
这里有一个稍微不同的解决方案,因为我想将加载的图像存储在一个变量中以便多次重复使用。
所以我只是更改了源 Volley,将 "private" 替换为 "protected" 方法
protected Response <Bitmap> doParse (NetworkResponse response)
然后我创建了一个 class 继承自 ImageRequest 并使用 AndroidSVG 库。
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.widget.ImageView;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.ImageRequest;
import com.caverock.androidsvg.SVG;
import com.caverock.androidsvg.SVGParseException;
/**
* Version modifiée de ImageRequest de Volley pour gérer aussi les images SVG
*/
public class MultiFormatImageRequest extends ImageRequest {
final String TAG = "EE." + getClass().getSimpleName();
boolean isSVG = false;
public MultiFormatImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
ImageView.ScaleType scaleType, Bitmap.Config decodeConfig, Response.ErrorListener errorListener) {
super(url, listener, maxWidth, maxHeight, scaleType, decodeConfig, errorListener);
String extension = url.substring(url.lastIndexOf("."));
isSVG = (extension.toUpperCase().contains("SVG"));
}
/****
* ATTENTION : "private" Response in Volley need to be changed in protected
*/
@Override
protected Response<Bitmap> doParse(NetworkResponse response) {
Bitmap image = null;
if (isSVG) {
try {
SVG svg = SVG.getFromString(new String(response.data));
int h = (int) svg.getDocumentHeight();
int w = (int) svg.getDocumentWidth();
image = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444); // transparent
Canvas bmcanvas = new Canvas(image);
svg.renderToCanvas(bmcanvas);
} catch (SVGParseException ex) {
ex.printStackTrace();
}
if (image == null) {
return Response.error(new ParseError(response));
} else {
return Response.success(image, HttpHeaderParser.parseCacheHeaders(response));
}
} else
return super.doParse(response); // Volley default
}
}
在我的 Android 应用程序中,我从我的网站下载文本内容并将其存储在我的 mysql 数据库中。现在我想从同一个网站下载和缓存图像。使用 AndroidVolley 的 <com.android.volley.toolbox.NetworkImageView
,下载普通图片效果很好。但我想下载 SVG 矢量图像,缓存它们并显示在我的应用程序中。到目前为止,这在 Android Volley...
我已经尝试使用 AndroidVolley 作为字符串下载 SVG,然后将它们放入 svg-android 元素 (See here),但是 svg-android 从来没有展示过我的形象。它似乎无法显示 Inkscape 创建的 SVG...
有谁知道一种简单的方法,如何下载这些文件并将它们显示在视图中?
谢谢
// 更新 27.3.2015 //
所以这是我的解决方案:
使用 Android Volley,我设置了 StringRequest
以将我的 SVG 图像作为字符串访问。 AndroidSVG 库(不要与 svg-android 库混淆)可以将此字符串转换为 SVG 对象并将其放入 SVGImageView
-View 中。这是一个示例代码它是如何工作的:
StringRequest stringRequest = new StringRequest("http://******/image.svg",new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
SVG svg = SVG.getFromString(response);
View view = getView();
if(view != null){
SVGImageView target = (SVGImageView)view.findViewById(catID);
target.setSVG(svg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(Globals.TAG,"Fehler "+error);
}
});
RequestQueue queue = Volley.newRequestQueue(mContext);
stringRequest.setShouldCache(true);
queue.add(stringRequest);
非常感谢!
您可以尝试两件事:
1.使用svg-android
库,需要设置
imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
使其发挥作用。
2.如果第一种方法不行,你可以试试SVGImageView
.
这里有一个稍微不同的解决方案,因为我想将加载的图像存储在一个变量中以便多次重复使用。
所以我只是更改了源 Volley,将 "private" 替换为 "protected" 方法
protected Response <Bitmap> doParse (NetworkResponse response)
然后我创建了一个 class 继承自 ImageRequest 并使用 AndroidSVG 库。
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.widget.ImageView;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.ImageRequest;
import com.caverock.androidsvg.SVG;
import com.caverock.androidsvg.SVGParseException;
/**
* Version modifiée de ImageRequest de Volley pour gérer aussi les images SVG
*/
public class MultiFormatImageRequest extends ImageRequest {
final String TAG = "EE." + getClass().getSimpleName();
boolean isSVG = false;
public MultiFormatImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
ImageView.ScaleType scaleType, Bitmap.Config decodeConfig, Response.ErrorListener errorListener) {
super(url, listener, maxWidth, maxHeight, scaleType, decodeConfig, errorListener);
String extension = url.substring(url.lastIndexOf("."));
isSVG = (extension.toUpperCase().contains("SVG"));
}
/****
* ATTENTION : "private" Response in Volley need to be changed in protected
*/
@Override
protected Response<Bitmap> doParse(NetworkResponse response) {
Bitmap image = null;
if (isSVG) {
try {
SVG svg = SVG.getFromString(new String(response.data));
int h = (int) svg.getDocumentHeight();
int w = (int) svg.getDocumentWidth();
image = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444); // transparent
Canvas bmcanvas = new Canvas(image);
svg.renderToCanvas(bmcanvas);
} catch (SVGParseException ex) {
ex.printStackTrace();
}
if (image == null) {
return Response.error(new ParseError(response));
} else {
return Response.success(image, HttpHeaderParser.parseCacheHeaders(response));
}
} else
return super.doParse(response); // Volley default
}
}