1

ImageView から派生したクラスがあります。

public class TouchView extends ImageView
{
   @Override
   protected void onDraw(Canvas canvas)
   ...

touchview は、アクティビティの onCreate で 1 回だけ作成され、SVG ファイルからドローアブルが取り込まれます。

ImageView imageView = new TouchView(this);
imageView.setScaleType(ImageView.ScaleType.MATRIX);
FrameLayout f = (FrameLayout)findViewById(R.id.frame2);
FrameLayout.LayoutParams l = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT);
f.addView(imageView, l);
...
is = openFileInput(svgname);
svg = SVGParser.getSVGFromInputStream(is);
is.close();

Drawable d = svg.createPictureDrawable();
imageView.setImageDrawable(d);

すべての環境は常に同じままです。それでも onDraw メソッドでは、イベント間でサイズが異なるキャンバスを取得しています。それはコードです:

protected void onDraw(Canvas canvas)
{
  super.onDraw(canvas);
  Log.v("DRAW", " w= " + canvas.getWidth() + " h=" + canvas.getHeight());
  ...
}

キャンバスの幅と高さが通常の 1024*728 (これはタブレットでの正しい表示寸法) から 200*160 (私の図面にバグを導入する奇妙なこと) に前後に変化する、線のあるログを生成します。私は恥ずかしい。

キャンバスは、同じビュー/ドローアブルに対して常に同じサイズにする必要がありますか? ドキュメントには、 getWidth および getHeight メソッドが現在の描画レイヤーの寸法を返すと記載されていますが、レイヤーとは何か、「舞台裏」でキャンバス用に作成されるレイヤーの数、およびこのプロセスを制御する方法は明確ではありません。

具体的には、描画されているビューの実際のサイズを取得することにより、一貫した描画動作を取得する方法についての説明をいただければ幸いonDrawです。

現在、ビューの getDrawingRect を呼び出す回避策を使用していますが、適切な方法かどうかはわかりません。描画のサイズ変更には のcanvasパラメーターで十分であるように思われるからです。onDraw

4

1 に答える 1

0

私は同じ問題を抱えていました。これが私がこれを修正した方法です。

protected void onDraw(Canvas c) {
    super.onDraw(c);
    int w = getWidth(), h = getHeight();
    // resize
Matrix resize = new Matrix();
resize.postScale((float)Math.min(w, h) / (float)mMarker.getWidth(), (float)Math.min(w, h) / (float)mMarker.getHeight());
imageScaled = Bitmap.createBitmap(mMarker, 0, 0, mMarker.getWidth(), mMarker.getHeight(), resize, false);

c.drawBitmap(imageScaled, 0,0, paint);

}

カスタム ImageView コンストラクターで mMarker が定義されている場所。

...
private Bitmap mMarker, imageScaled;
Paint paint = new Paint();


//Java constructor
public AvatarImageView(Context context) {
    super(context);
    init();
}

//XML constructor
public AvatarImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    // load the image only once
    mMarker = BitmapFactory.decodeResource(getResources(), R.drawable.silhouette_48);
    mMarker.setHasAlpha(true);paint.setColor(Color.WHITE);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(4);

    //invalidate(); // don't know if I need this
}
于 2012-07-24T01:52:37.370 に答える