Comment puis-je obtenir la taille du canevas d'une vue personnalisée en dehors de la méthode onDraw?

Je dois pouvoir accéder à la taille du canevas de la vue pour effectuer des calculs. Pour une raison quelconque, la taille de la vue passée à onSizeChanged est différente de la taille du canevas passé à onDraw. Ma solution de contournement actuelle utilise un indicateur booléen pour déterminer quand je dois faire les calculs.

La solution idéale me permettrait de faire ces calculs dans la méthode onSizeChanged, donc je me demande... est-il possible que je puisse mettre la main sur l'objet Canvas (ou au moins ses dimensions) en dehors de la méthode onDraw?

Mon code est ci-dessous. Il attire le rayon d'un cercle à un angle donné. Lorsque j'utilise canvas.centerX() pour déterminer les points de début et de fin pour le rayon, tout fonctionne parfaitement. Si j'utilise les paramètres passés dans onSizeChanged, Il n'est même pas proche de corriger.

@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);
}
26
demandé sur dfetter88 2011-07-11 19:17:09

1 réponses

À des fins de dessin, vous ne devriez pas vraiment utiliser les dimensions de l'objet Canvas.

Utilisez simplement les dimensions qui vous sont fournies dans la méthode onSizeChanged. Vous pouvez stocker les dimensions à utiliser dans la méthode onDraw ou redimensionner / dessiner sur un bitmap de sauvegarde que vous pouvez dessiner plus tard.

Mise à Jour:

Rapidement fouetté du code, il semble que cela fonctionne:

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);   
    }
}

Mise à Jour 2

Suite à la mise à jour du code circle.

On peut faire ce:

   @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);
    }

Vous verrez que cela fonctionne maintenant sur n'importe quelle vue de taille.

32
répondu Che Jami 2011-07-11 20:13:39