Bazı hesaplamalar yapmak için görünüm tuvalinin boyutuna erişebilmem gerekir. Bazı nedenlerden dolayı, onSizeChanged
görünümüne geçirilen görünümün boyutu, tuvalin onDraw
10'a geçirilen boyutundan farklıdır. Mevcut geçici çözümüm, hesaplamaları ne zaman yapmam gerektiğini belirlemek için bir boole bayrağı kullanıyor. Ben onDraw
dışında Canvas
nesnenin ulaşmamın (veya en azından kendi boyutlarını) herhangi bir yolu yoktur ...Özel bir görünümün tuval boyutunu onDraw yönteminin dışında nasıl edinebilirim?
ideal çözüm beni onSizeChanged
yönteminde bu hesaplamaları yapmak için izin verecek, bu yüzden merak ediyorum yöntem?
Kodum aşağıda. Belirli bir açıda dairenin yarıçapını çizer. Yarıçap için başlangıç noktalarını ve bitiş noktalarını belirlemek için canvas.centerX()
kullandığımda, her şey mükemmel çalışır. onSizeChanged
'a iletilen parametreleri kullanırsam, düzeltmek için uzaktan bile yakın değildir.
@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);
}
Bunun ile iyi olur, ancak onSizeChanged yöntemi bana uygun numaralar vermez. Örneğin, görünümün ortasında bir metin çizmek istediğimi varsayalım. OnSizeChanged'e iletilen değerleri saklarsam ve metnin nereye çizileceğini belirlemek için bunları kullanırsam, doğru yerde çizilmez. Metnin nereye çizileceğini belirlemek için tuval boyutlarını kullanırsam, mükemmel çalışır. – dfetter88
w/2 & h/2 değerlerinizi canvas.centerX() ve canvas.centerY() yöntemleriyle karşılaştırırsanız, değerlerin farklı olduğunu görürsünüz. – dfetter88
Kodunuzu kullandığımda, metin hiç görüntülenmiyor çünkü w/2 ve h/2, tuvalden daha büyük koordinatları veriyor. Böylece, metin ekranda görüntülenmeyen bir yere çizilir. – dfetter88