android - 如何在 onDraw 方法之外获取自定义 View 的 Canvas 大小?

标签 android view custom-view android-custom-view

我需要能够访问 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/

相关文章:

android - 将参数传递给 AsyncTask,并返回结果

android - 在 Android 中动态更改 View 内部 View

android - 使用 include 后 ListView 不显示

Android开发-按钮 react 慢

android - ListView 中 Custom ArrayAdapter 的自定义过滤

android - 在arcore中绘制到相机中心的垂直线

view - SEO 友好的暴露过滤器 View Drupal 7

ios - 自定义 header UIView 到所有 VC?

ios - 自定义 UILabel View 未更新其在 Interface Builder 中的框架

java - 安卓屏幕截图