我需要能够访问 View Canvas 的大小来执行一些计算。由于某种原因,传递给 onSizeChanged
的 View 大小与传递给 onDraw
的 Canvas 大小不同。我当前的解决方法使用 bool 标志来确定何时需要进行计算。
理想的解决方案将允许我在 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);
}
您会发现这现在适用于任何大小的 View 。
关于android - 如何在 onDraw 方法之外获取自定义 View 的 Canvas 大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652400/