私はこの周りに私の頭を包んでいないので、誰かが私を助けることを望んでいる。キャンバスを拡大して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はデフォルトのキャンバスを上書きします(これは私が望むものです)。
あなたのソリューションがカスタムビューのonDrawメソッドにあると仮定し、そのメソッドを直接呼び出さないとわかったと仮定して... ;-)新しいCanvasを作成する場合は何もする必要はありませんが、または、ビットマップさえ。そうすることで、svgを使用する際に効率的な利点(メモリ関連)が失われてしまいます。代わりに、onDrawメソッドに渡されたキャンバスを使用してcanvas.drawPicture(vector.getPicture()、新しいRect(0,0、width、height))を呼び出すことができます。ビュークラスをより拡張可能にしたい場合は、未加工のsvgの名前を示すスタイル可能な属性を追加してから – wkhatch
(2)を呼び出し、生の名前に対応するリソースIDにString resourceName = a.getString(R.styleable.YouViewClassName_yourViewsCustomAttributeName); svgResourceId = getResources()。getIdentifier(resourceName、 "raw"、getContext()。getPackageName()); – wkhatch
ああ、変数はTypedArrayオブジェクトです。これは、ビューに指定したスタイル可能なすべての属性にアクセスできるようにします。通常、コンストラクタのいずれかで設定するか、コンストラクタが呼び出す単純なメソッドです。いずれかの本体では、次のようなことを行います。final TypedArray a = getContext()。obtainStyledAttributes(attrs、R.styleable.YourCustomViewClassName、defStyle、0); – wkhatch