Ответ 1
В целях рисования вы не должны использовать размеры объекта Canvas
.
Просто используйте размеры, предоставленные вам в методе onSizeChanged
. Вы можете либо сохранить размеры для использования в методе onDraw
, либо изменить размер/рисовать на базовую растровую карту, которую вы можете рисовать позже.
Update:
Быстро взломать код, похоже, что это работает:
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);
}
Вы увидите, что теперь это работает на любом размере.