0

В моем приложении для Android я загружаю текстовое содержимое с моего сайта и сохраняю его в своей базе данных mysql. Теперь я хочу загружать и кэшировать изображения с одного и того же веб-сайта. С помощью AndroidVolley's <com.android.volley.toolbox.NetworkImageView, загрузка обычных фотографий работает очень хорошо. Но я хочу загрузить SVG-векторные изображения, кешировать их и отображать в своем приложении. Пока это невозможно в Android Volley ...Android Volley display SVG image

Я уже пытался загрузить SVG с помощью AndroidVolley в качестве строки, а затем поместить их в элемент svg-android (See here), но svg-android никогда не показывал мои образ. Кажется, что он не может отображать SVG, созданные Inkscape ...

Кто-нибудь знает простой способ, как загрузить эти файлы и отобразить их в виде?

Благодаря

// UPDATE 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); 

Спасибо большое!

+0

Вы видели мой ответ? –

+0

Да, спасибо. Я попытаюсь ответить на этот уик-энд ;-) – Jokus

+0

Я только что попробовал первый совет, но я никогда не мог увидеть изображение ... Таким образом, я получаю несколько записей Logcat-записей, которые говорят мне, что в svg есть узлы, которые могут Не отображается. Может быть, Inkscape сгенерировал SVG-проблемы ... Я буду искать это позже и расскажу вам результат;) – Jokus

ответ

0

Вы можете попробовать две вещи:

1. С svg-android библиотека, вам необходимо установить

imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

, чтобы заставить его работать.

2. Если первый подход не работает, вы можете попробовать использовать SVGImageView.

+0

Первый совет не сработал, потому что svg-android явно несовместим с создаваемыми SVG-файлами Inkscape. Но второй! Спасибо большое! – Jokus

+0

Первый подход не относится к svg-android. Он применяется к любой библиотеке, которая использует определенные API Canvas. –

+0

@PaulLeBeau: Правда, но его известная причина появления изображений SVG не отображается (если не используется). –

1

Вот несколько другое решение, потому что я хотел несколько раз сохранить изображение, загруженное в переменную для повторного использования.

Так что я просто изменил источник Volley замены «частной» с «защитой» для метода

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 
    } 
}