いくつかの計算を実行するには、ビューのキャンバスのサイズにアクセスできる必要があります。何らかの理由で、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);
}
描画のために、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);
}
これがどのサイズのビューでも機能することがわかります。