Android Volley дисплей SVG изображение
В своем приложении для Android я загружаю текстовый контент со своего веб-сайта и сохраняю его в своей базе данных mysql. Теперь я хочу скачать и кэшировать изображения с того же сайта. С AndroidVolley's <com.android.volley.toolbox.NetworkImageView
, загрузка нормальных картинок работает довольно хорошо. Но я хочу скачать SVG-векторные изображения, кэшировать их и отобразить в моем приложении. Пока что это невозможно в Android Volley...
Я уже пытался загрузить SVG с AndroidVolley в виде строки, а затем поместить их в элемент svg-android ( см. Здесь), но svg-android никогда не показывал мое изображение. Кажется, что он не может отображать SVG, созданные Inkscape...
Кто-нибудь знает простой способ, как загрузить эти файлы и отобразить их в виде?
Спасибо
// ОБНОВЛЕНИЕ 27.3.2015 //
Так что это мое решение: с Android Volley я установил StringRequest
чтобы получить доступ к моему SVG-изображению в виде строки. Библиотека AndroidSVG (не путайте с библиотекой svg-android) может преобразовать эту строку в объект SVG и поместить ее в SVGImageView
-Посмотреть. Вот пример кода, как это работает:
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);
Большое спасибо!
2 ответа
Вы можете попробовать две вещи:
1. С svg-android
библиотека, вам нужно установить
imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
чтобы это работало.
2. Если первый подход не работает, вы можете попробовать использовать SVGImageView
,
Вот немного другое решение, потому что я хотел сохранить изображение, загруженное в переменную, для повторного использования несколько раз.
Поэтому я просто изменил исходный Volley, заменив "private" на "protected" для метода
protected Response <Bitmap> doParse (NetworkResponse response)
Затем я создал класс, который наследуется от 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
}
}