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
    }
}
Другие вопросы по тегам