2013-01-05 8 views
10

私はこの周りに私の頭を包んでいないので、誰かが私を助けることを望んでいる。キャンバスを拡大してAndroidでSVGのサイズを変更する

私はsvg-androidを使ってSVGからドロウアブルを取得していますが、ドロウアブルはビューにスケーリングされていません。私が見つけたことは、キャンバスに直接描画してキャンバスを再スケーリングする必要があると言いますが、私がそれを試してみると、境界を変更するだけでイメージを拡大することはできません。

これは私がこれまで試したものです:

ImageView testview = (ImageView)findViewById(R.id.testview); 

//Get SVG and convert to drawable 
SVG vector = SVGParser.getSVGFromResource(getResources(),R.drawable.testvector); 
Drawable test = vector.createPictureDrawable(); 

testview.setBackground(test); //displays fine, but won't scale to the dimensions of 
           //the View 

//function that clips the image but doesn't scale: 
Drawable testTwo = new CustomPictureDrawable(vector.getPicture(), 
(float)0.5, (float)0.5); 

testView.setBackground(testTwo); 

class CustomPictureDrawable extends PictureDrawable { 
    private float scalex, scaley; 

public CustomPictureDrawable(Picture picture, float scalex, float scaley) { 
    super(picture); 
    this.scalex = scalex; 
    this.scaley = scaley; 
} 

@Override 
public void draw(Canvas canvas) { 
    Matrix original = canvas.getMatrix(); 
    canvas.scale(scalex, scaley); 
    super.draw(canvas); 
    canvas.setMatrix(original); 
} 
} 

//doesn't display anything 
Picture testThree = vector.getPicture(); 

Bitmap b = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_4444); 
Canvas c = new Canvas(b); 

c.drawPicture(testThree, new Rect(0,0,10,10)); 

testview.draw(c); 

は、私はまた、スケールビットマップを作成する関数を見つけましたが、画質が大幅に削減されたので、私もちょうど使用することができますスケーリングされたPNG。

明らかに私は何かが不足していて、私の経験不足は本当にイライラさせています。私が行うことができるようにようをいただきたい何

はそれから絵やPictureDrawableを引っ張って前にSVG-アンドロイド完全に再規模にSVGを持っているが、私はSVGParserをステップ実行する方法を見つけ出すことはできませんとにかく、すべての座標ペアで乗数を実行することはおそらくスーパーリソースを集中させることになります。

[編集]画像を拡大縮小して再描画し、それをビューに割り当てる唯一の方法は、カスタムビューを作成してOnDrawを上書きすることですか?

すなわち

Picture testThree = vector.getPicture(); 

Bitmap b = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_4444); 
Canvas c = new Canvas(b); 

c.drawPicture(testThree, new Rect(0,0,10,10)); 

//CustomView extends ImageView or Button or whatever with OnDraw overridden and no 
//other changes 
CustomView testview = (CustomView)findViewById(R.id.testview); 

testview.OnDraw(c); 

私は正しい軌道に乗っていますか?キャンバスCはデフォルトのキャンバスを上書きします(これは私が望むものです)。

答えて

8

私はそれを理解しました。あるいは、少なくとも働く方法を考え出した。答えは、私が好きではなかったスケーリングされたビットマップ関数で、私の顔を見つめていた。私は基本的にPictureクラスとDraw呼び出しがどのように機能しているのか誤解していました。

それを引っ張っているように見えるコード:

//Get a Picture from the SVG 
SVG vector = SVGParser.getSVGfromResource(getResources(), R.raw.testvector); 

Picture test = vector.getPicture(); 

//Redraw the picture to a new size 
Bitmap bitmap = Bitmap.createBitmap(desired width, desired height, config); 

Canvas canvas = new Canvas(bitmap); 

Picture resizePicture = new Picture(); 

canvas = resizePicture.beginRecording(desiredWidth, desiredGeight); 

canvas.drawPicture(test, new Rect(0,0,desiredWidth, desiredHeight); 

resizePicture.endRecording(); 

//get a drawable from resizePicture 
Drawable vectorDrawing = new PictureDrawable(resizePicture); 

私はのgetWidth(からdesiredWidthとdesiredHeightを取得することにより、好きなビューにサイズを)とのgetHeight()の呼び出し、およびsetBackground(vectorDrawing)にすることができますそれをビューに配置します。

+2

あなたのソリューションがカスタムビューのonDrawメソッドにあると仮定し、そのメソッドを直接呼び出さないとわかったと仮定して... ;-)新しいCanvasを作成する場合は何もする必要はありませんが、または、ビットマップさえ。そうすることで、svgを使用する際に効率的な利点(メモリ関連)が失われてしまいます。代わりに、onDrawメソッドに渡されたキャンバスを使用してcanvas.drawPicture(vector.getPicture()、新しいRect(0,0、width、height))を呼び出すことができます。ビュークラスをより拡張可能にしたい場合は、未加工のsvgの名前を示すスタイル可能な属性を追加してから – wkhatch

+0

(2)を呼び出し、生の名前に対応するリソースIDにString resourceName = a.getString(R.styleable.YouViewClassName_yourViewsCustomAttributeName); svgResourceId = getResources()。getIdentifier(resourceName、 "raw"、getContext()。getPackageName()); – wkhatch

+0

ああ、変数はTypedArrayオブジェクトです。これは、ビューに指定したスタイル可能なすべての属性にアクセスできるようにします。通常、コンストラクタのいずれかで設定するか、コンストラクタが呼び出す単純なメソッドです。いずれかの本体では、次のようなことを行います。final TypedArray a = getContext()。obtainStyledAttributes(attrs、R.styleable.YourCustomViewClassName、defStyle、0); – wkhatch

6

私は同様の問題を抱えていました。これは私が学んだことと、それをどのように解決したかです。 まず、私が欲しかったサイズを持っていなかったキャンバス

svg.renderToCanvas(canv); 

に直接私のSVGをレンダリングしようとしました。それから私は

svg.renderToCanvas(canv,new RectF(0,0,200,200)); 

svg.setDocumentWidth(200); 
svg.renderToCanvas(canv); 

を使用して画像のサイズを変更しようとしましたが、両方が動作しませんでしたので、私は私のSVGを見て始めました。問題は私のSVGがこの

<svg width="66.3679625" height="100.4148375" xmlns="http://www.w3.org/2000/svg"> 

のように始まっていることだったし、幅と高さは、その後のコードでこれを変更するには、SVGに設定されると、それは、不可能です。 AndroidSvgFAQには、それらの属性を削除することを推奨する回答もあります。だから私は、私がで左上の角のボックスの内容を取得し、今私は

svg.setDocumentWidth(200); 
svg.renderToCanvas(canv); 

上記のコードを使用するので、もしビューボックスの属性は、私のSVG画像のフレームである

<svg version="1.1" viewBox="0 0 1280 696" xmlns="http://www.w3.org/2000/svg"> 

にこれを変更します幅が200になるようにリサイズされた(0,0)および(1200,696)の右下角。比率を維持する比率の振る舞いを変更することができます。 1は、SVGで幅、heigthとViewBoxを省略し、ViewBoxをがW3ViewBoxを参照してください属性の詳細を知るために

svg.setDocumentViewBox(0,0,width,height); 

プログラムでViewBoxを設定できることに注意してください。

+0

バターのように動作します! – whitepearl

関連する問題