Hi,

I've been struggling with text measuring and scaled canvases.

When the canvas is unscaled, getTextBounds and measureText deliver
accurate results. However, when the canvas is scaled both methods do
not deliver results that match the actual size of a printed text.

For testing I've created a subclass of View with the following onDraw
method:

    final float scaling = 0.51f;
    final int fontSize = 50;

    canvas.scale(scaling, scaling);
    font = Typeface.create("Arial", Typeface.NORMAL);

    Paint paint = new Paint();
    paint.setColor(0xff4444ff);
    paint.setTypeface(font);
    paint.setTextSize(fontSize);
    paint.setAntiAlias(true);

    int x = 10;
    int y = 100;
    final String text = "Lorem ipsum dolor sit amet, consectetur
adipisici elit...";
    canvas.drawText(text, x, y, paint);

    // draw border using getTextBounds

    paint.setColor(0xffff0000);
    paint.setStyle(Paint.Style.STROKE);
    paint.setTypeface(font);
    paint.setTextSize(fontSize);
    Rect bounds = new Rect();
    paint.getTextBounds(text, 0, text.length(), bounds);
    bounds.offset(x, y);
    paint.setColor(0x80ffff00);
    canvas.drawRect(bounds, paint);

    // draw border using measureText

    float w = paint.measureText(text);
    bounds.left = x;
    bounds.right = (int) Math.ceil(bounds.left + w);
    bounds.top -= 10;
    bounds.bottom += 10;
    paint.setColor(0x8000ffff);
    paint.setPathEffect(new DashPathEffect(new float[] { 10, 10 },
0));
    canvas.drawRect(bounds, paint);

for scaling = 0.5 I get the following output:
http://www.tiikoni.com/tis/view/?id=911e914

for scaling = 0.51 the following result is shown:
http://www.tiikoni.com/tis/view/?id=fad4658

(The actual result may vary depending on screen size, the important
part is that the results can vary completely when changing the scale
factor only a little)

The yellow solid border marks the rect delivered from getTextBounds,
the dashed cyan rect is rendered using the width delivered from
measureText.

As you can see, the text with scaling = 0.5 is smaller than the
measured dimensions and with scaling=0.51 the drawn text is way bigger
than the measured dimension.


Any help is appreciated!

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to