4

アセットフォルダーにいくつかの SVG があり、それらを (ImageView の) ウィジェットに動的に設定する必要があります。

私はこのライブラリを使用しています: http://code.google.com/p/svg-android/

このライブラリは、Picture または PictureDrawable を返します。

RemoteView で使用できるメソッドは setImageViewBitmap だけで、これは明らかにビットマップを取ります。

次のように、Drawable を Bitmap に変換するコードを探してみました。

PictureDrawable pictureDrawable = svg.createPictureDrawable();
Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
canvas.drawPicture(pictureDrawable.getPicture()); 
currentBitmap = bitmap;

しかし、ビットマップが小さすぎます。Illustrator でビットマップを作成するときは、アートボードのサイズを 65 に設定します。これは、固有の幅/高さを通過するものです。

ImageView のサイズが可変になるように、ウィジェットのサイズを変更できます。このように幅と高さを静的に大きな数値に設定しても...

 Bitmap bitmap = Bitmap.createBitmap(300, 300, Config.ARGB_8888); 

結果のビットマップには、小さな画像の下と右にたくさんの空白があります。

サイズ300でビットマップを作成するだけでなく、拡大された値で画像を描画する必要があると思います。理想的には、実行時にImageViewのサイズを把握し、それがわかっている場合は適切なサイズのビットマップを設定できます。これが最善のアプローチですか、どうすればよいですか? おそらく、私が知らないより良いアプローチがありますか?

4

4 に答える 4

4

私は使用していませんandroid-svgが、バニラPictureDrawables を使用している場合は、固有の境界を使用しないだけの問題です。

次のことを試してください。

PictureDrawable pictureDrawable = svg.createPictureDrawable();
Bitmap bitmap = Bitmap.createBitmap(300, 300, Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
pictureDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
pictureDrawable.draw(canvas); // do not access the Picture directly, that defeats the purpose
currentBitmap = bitmap;

つまり、Picture ではなく Drawable を使用し、Drawable の境界を完全なキャンバスに設定します。

于 2013-02-26T15:34:25.660 に答える
1

createScaledBitmapを試しましたか?

createScaledBitmap()

于 2013-02-26T14:54:26.873 に答える
1

私は試してみsvg-androidましたが、まさにこの理由でうまくいきませんでした。機能セットが大幅に制限されていることは言うまでもありません。

ベクター グラフィックスを使用するポイントは、UI ビューのサイズに合わせて適切なサイズの画像を生成できることです。つまり、生成メソッドは実行時にサイズ要件を受け入れる必要があり、タグwidthheight宣言された を常に使用する必要はありません。<svg>

したがって、ネイティブ実装を使用libsvg-androidしました: 、これはまさにそれを行います。

指定されたサイズのキャンバスに直接レンダリングします。

long objId = SvgRaster.svgAndroidCreate();
SvgRaster.svgAndroidParseBuffer(objId, readString(mInputStream, "UTF-8"));
SvgRaster.svgAndroidSetAntialiasing(objId, true);
SvgRaster.svgAndroidRenderToArea(objId, mCanvas, 0, 0, mWidth, mHeight);
于 2013-03-02T07:58:40.057 に答える
1

基礎となるアートボードのサイズを 300 に変更することになりました。スケールアップ方法はどれも機能しませんでした。したがって、私が使用した最終的なコードは、最初に投稿したものです。

PictureDrawable pictureDrawable = svg.createPictureDrawable();
Bitmap bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
canvas.drawPicture(pictureDrawable.getPicture()); 
currentBitmap = bitmap;

300x300 ビットマップを取得したら、 setImageViewBitmap を使用して RemoteViews に設定できました。

この種のものは、そもそも SVG を使用する目的を無効にしました (少なくともウィジェットでの使用に関する限り)。

私の問題は User117 と同じではありませんでした。おそらく彼は、ライブラリで必要とされていたように、外側のレイヤーに「境界」という名前を付けていませんでした。いずれにせよ、SVG アートボードのサイズを変更する必要はありましたが、なんとかライブラリを機能させることができました。

画面解像度の向上に伴い、Android が SVG をプラットフォームの一部としてまもなく導入することを願っています。

于 2013-03-17T09:10:23.593 に答える