いくつかの計算を実行するには、ビューのキャンバスのサイズにアクセスできる必要があります。なんらかの理由で、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);
}
私はそれでいいですが、onSizeChangedメソッドは私に適切な番号を与えません。たとえば、ビューの中央にテキストを描きたいとします。 onSizeChangedに渡された値を保存し、それらを使用してテキストをどこに描画するかを判断する場合、正しい場所に描画されません。キャンバスディメンションを使用してテキストを描画する場所を決定すると、完全に機能します。 – dfetter88
w/2とh/2の値をcanvas.centerX()とcanvas.centerY()メソッドの結果と比較すると、値が異なることがわかります。 – dfetter88
コードを使用すると、w/2とh/2がキャンバスよりも大きな座標を与えるため、テキストがまったく表示されません。したがって、テキストは画面に表示されない場所に描画されます。 – dfetter88