programacion - manual android studio avanzado
¿Cómo puedo obtener el tamaño del lienzo de una vista personalizada fuera del método onDraw? (1)
Necesito poder acceder al tamaño del lienzo de la vista para realizar algunos cálculos. Por alguna razón, el tamaño de la vista pasada a onSizeChanged
es diferente al tamaño del lienzo pasado a onDraw
. Mi solución actual utiliza una bandera booleana para determinar cuándo debo realizar los cálculos.
La solución ideal me permitiría hacer estos cálculos en el método onSizeChanged
, así que me pregunto ... ¿hay alguna manera de poder obtener un objeto Canvas
(o al menos sus dimensiones) fuera del método onDraw
?
Mi código está abajo. Es dibuja el radio de un círculo en un ángulo dado. Cuando uso canvas.centerX()
para determinar los puntos de inicio y los puntos finales del radio, todo funciona perfectamente. Si utilizo los parámetros pasados a onSizeChanged
, ni siquiera se puede cerrar de forma remota para corregirlos.
@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);
}
Para fines de dibujo, no debe utilizar realmente las dimensiones del objeto Canvas
.
Simplemente use las dimensiones proporcionadas a usted en el método onSizeChanged
. Puede almacenar las dimensiones para su uso en el método onDraw
o cambiar el tamaño / dibujar a un mapa de bits de respaldo que puede dibujar más adelante.
Actualizar:
Rápidamente batido un poco de código, parece que esto funciona:
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);
}
}
Actualización 2
Siguiendo la actualización del código del círculo.
Podemos hacer esto:
@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);
}
Verás que esto ahora funciona en cualquier vista de tamaño.