2011-07-11 3 views
23

いくつかの計算を実行するには、ビューのキャンバスのサイズにアクセスできる必要があります。なんらかの理由で、onSizeChangedに渡されるビューのサイズは、onDrawに渡されるキャンバスのサイズとは異なります。現在の回避策では、ブール値フラグを使用して計算をいつ行う必要があるかを判断します。私はonDrawを外Canvasオブジェクトのネタを取得する(あるいは、少なくともそれの寸法)することができますどのような方法がある...onDrawメソッドの外でカスタムビューのキャンバスサイズを取得するにはどうすればよいですか?

理想的なソリューションは、私がonSizeChanged方法でこれらの計算を行うことができるようになるので、私は思ったんだけど方法?

私のコードは以下の通りです。与えられた角度で円の半径を描きます。 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); 
} 

答えて

31

描画の目的では、実際に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); 
    } 

を。

+0

私はそれでいいですが、onSizeChangedメソッドは私に適切な番号を与えません。たとえば、ビューの中央にテキストを描きたいとします。 onSizeChangedに渡された値を保存し、それらを使用してテキストをどこに描画するかを判断する場合、正しい場所に描画されません。キャンバスディメンションを使用してテキストを描画する場所を決定すると、完全に機能します。 – dfetter88

+1

w/2とh/2の値をcanvas.centerX()とcanvas.centerY()メソッドの結果と比較すると、値が異なることがわかります。 – dfetter88

+0

コードを使用すると、w/2とh/2がキャンバスよりも大きな座標を与えるため、テキストがまったく表示されません。したがって、テキストは画面に表示されない場所に描画されます。 – dfetter88

関連する問題