web-dev-qa-db-ja.com

onDrawメソッドの外でカスタムビューのキャンバスサイズを取得するにはどうすればよいですか?

いくつかの計算を実行するには、ビューのキャンバスのサイズにアクセスできる必要があります。何らかの理由で、onSizeChangedに渡されるビューのサイズは、onDrawに渡されるキャンバスのサイズとは異なります。現在の回避策では、ブールフラグを使用して、計算を行う必要があるタイミングを決定します。

理想的な解決策は、onSizeChangedメソッドでこれらの計算を行うことを可能にするので、私は不思議に思っています... Canvasオブジェクト(または少なくともそれは次元)onDrawメソッドの外側?

私のコードは以下です。円の半径を指定された角度で描画します。 canvas.centerX()を使用して半径の始点と終点を決定すると、すべてが完全に機能します。 onSizeChangedに渡されたパラメーターを使用する場合、リモートに近いほど正確ではありません。

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  super.onSizeChanged(w, h, oldw, oldh);
  mSizeChanged = true;
}

@Override
protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);

  if (mSizeChanged) {
    RectF bounds = new RectF(canvas.getClipBounds());
    float centerX = bounds.centerX();
    float centerY = bounds.centerY();
    float radianAngle = (float) Math.toRadians(mStartAngle);

    mRadius[0] = center;
    mRadius[1] = center;
    mRadius[2] = center + center * FloatMath.cos(radianAngle);
    mRadius[3] = center + center * FloatMath.sin(radianAngle);
    mSizeChanged = false;
  }

  mPaint.setColor(0xFF330000);
  mPaint.setStrokeWidth(1);
  canvas.drawLines(mRadius, mPaint);
}
30
dfetter88

描画のために、Canvasオブジェクトの寸法を実際に使用しないでください。

onSizeChangedメソッドで提供されているディメンションを使用するだけです。 onDrawメソッドで使用するために寸法を保存するか、後で描画できるバッキングビットマップにサイズ変更/描画することができます。

更新:

すぐにいくつかのコードを修正しました、これはうまくいくようです:

public class CustomView extends View{
    private Paint paint;
    private int w;
    private int h;

    public CustomView(Context context, AttributeSet attr) {
        super(context, attr);
        Paint = new Paint();
        Paint.setTextAlign(Align.CENTER);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        this.w = w;
        this.h = h;
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        canvas.drawText("TEST", w/2, h/2, Paint);   
    }
}

更新2

サークルコード更新後。

できるよ:

   @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        float centerX = (float) w/2;
        float centerY = (float) h/2;
        float radianAngle = (float) Math.toRadians(startAngle);

        radius[0] = centerX;
        radius[1] = centerY;
        radius[2] = centerX + centerX * FloatMath.cos(radianAngle);
        radius[3] = centerY + centerY * FloatMath.sin(radianAngle);

        Paint.setColor(0xFF330000);
        Paint.setStrokeWidth(1);
        canvas.drawLines(radius, Paint);
    }

これがどのサイズのビューでも機能することがわかります。

32
Che Jami