0

私の Android アプリでは、Web サイトからテキスト コンテンツをダウンロードし、それを mysql データベースに保存します。今、同じウェブサイトから画像をダウンロードしてキャッシュしたいと考えています。AndroidVolley の<com.android.volley.toolbox.NetworkImageViewでは、通常の写真のダウンロードはかなりうまく機能します。しかし、SVG ベクター画像をダウンロードしてキャッシュし、アプリに表示したいと考えています。これまでのところ、これは Android Volley では不可能です...

私はすでに AndroidVolley を文字列として SVG をダウンロードし、それらを svg-android 要素に入れようとしましたが (こちらを参照)、svg-android は私のイメージを表示しませんでした。Inkscape で作成された SVG を表示できないようです...

これらのファイルをダウンロードしてビューに表示する簡単な方法を知っている人はいますか?

ありがとう

// 2015 年 3 月 27 日更新 //

これが私の解決策です。Android Volley をStringRequest使用して、SVG イメージに文字列としてアクセスするように設定しました。AndroidSVGライブラリ( svg-android ライブラリと混同しないでください) は、この String を SVG-Object に変換し、それを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);

どうもありがとう!

4

2 に答える 2

1

数回再利用するために変数にロードされた画像を保存したかったので、これは少し異なる解決策です。

そのため、メソッドの「プライベート」を「保護」に置き換えてソースボレーを変更しました

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
    }
}
于 2015-12-26T15:59:34.640 に答える
0

次の 2 つのことを試すことができます。

1.ライブラリでは、svg-android設定する必要があります

imgView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

それを機能させるために。

2.最初の方法がうまくいかない場合は、 を試してみてくださいSVGImageView

于 2015-03-20T09:43:13.020 に答える