Hi,

This is not the proper way to measure scaled text. The font size
defines the height of the font, not its width. There is no guarantee
whatsoever that scaling a font size by a number S will scale the width
of the text by the same number S. The proper way is to always call
measureText() with the font size you are actually going to use. If you
apply a scale factor on the Canvas, simply multiply the result of
measureText() with the scale factor.


On Fri, Mar 2, 2012 at 4:02 AM, Kaloyan Donev <[email protected]> wrote:
> Hi,
>
> I am using a Typeface to draw text in canvas which have scale matrix. So
> first I measure the width of text when scale is 1.0. Then I measure the
> width of text when scale is different than 1.0. And I expect that non scaled
> width * scale will be equal to scaled width. This is true on devices with
> Android OS below 4.0, but on Android 4.0 it is not true. Here is sample
> function that I wrote to test it.
>
>         static void checkGoodForScale(Typeface face)
>     {
>         TextPaint p = new TextPaint();
>
>         p.setAntiAlias(true);
>         p.setSubpixelText(true);
>
>         p.setTypeface(face);
>
>         final String text = "During that discussion, we touched a bit on the
> psychological impact all of this—the earthquake";
>         final float textSize = 22.f;
>
>         p.setTextSize(textSize);
>
>         float textWidth = p.measureText(text);
>
>         float scale = 0.05f;
>
>         while (scale < 1.509)
>         {
>             p.setTextSize(textSize * scale);
>             float scaledTextWidth = p.measureText(text);
>
>             if (Math.abs(scaledTextWidth - textWidth*scale) > 1.5f)
>             {
>                 Log.d("FontScaleTest", "Diff in scale width. 100% = " +
> textWidth*scale + " " +
>                         (int)(scale*100f) + "% = " + scaledTextWidth +
>                         " diff = " + (scaledTextWidth - textWidth*scale) );
>             }
>
>             scale += 0.01f;
>         }
>     }
>
> The above function didn't print any messages in log on Android below 4.0. On
> android 4.0 there is difference on each scale percent. I noticed that widths
> are separated in groups of 4-5 percents. For example for scale 45% if width
> is W it is the same for 46%, 47%, 48% and then on 49% it is different. May
> be there is some kind of cache for closer font sizes.
>
> Here is a part of my logcat:
>
> D/FontScaleTest( 4408): Diff in scale width. 100% = 686.5115 51% = 660.1074
> diff = -26.404053
> D/FontScaleTest( 4408): Diff in scale width. 100% = 699.7136 52% = 720.1172
> diff = 20.403564
> D/FontScaleTest( 4408): Diff in scale width. 100% = 712.9157 53% = 720.1172
> diff = 7.201477
> D/FontScaleTest( 4408): Diff in scale width. 100% = 726.11786 54% = 720.1172
> diff = -6.0006714
> D/FontScaleTest( 4408): Diff in scale width. 100% = 739.32 55% = 720.1172
> diff = -19.20282
> D/FontScaleTest( 4408): Diff in scale width. 100% = 752.52216 56% =
> 780.12695 diff = 27.604797
> D/FontScaleTest( 4408): Diff in scale width. 100% = 765.72424 57% =
> 780.12695 diff = 14.40271
> D/FontScaleTest( 4408): Diff in scale width. 100% = 792.12854 59% =
> 780.12695 diff = -12.001587
> D/FontScaleTest( 4408): Diff in scale width. 100% = 805.3307 60% = 780.12695
> diff = -25.203735
> D/FontScaleTest( 4408): Diff in scale width. 100% = 818.53284 61% = 840.1367
> diff = 21.603882
> D/FontScaleTest( 4408): Diff in scale width. 100% = 831.7349 62% = 840.1367
> diff = 8.401794
> D/FontScaleTest( 4408): Diff in scale width. 100% = 844.9371 63% = 840.1367
> diff = -4.800354
> D/FontScaleTest( 4408): Diff in scale width. 100% = 858.1392 64% = 840.1367
> diff = -18.002502
> D/FontScaleTest( 4408): Diff in scale width. 100% = 871.3414 65% = 900.1465
> diff = 28.805115
> D/FontScaleTest( 4408): Diff in scale width. 100% = 884.5435 66% = 900.1465
> diff = 15.602966
> D/FontScaleTest( 4408): Diff in scale width. 100% = 897.7456 67% = 900.1465
> diff = 2.400879
> D/FontScaleTest( 4408): Diff in scale width. 100% = 910.94775 68% = 900.1465
> diff = -10.80127
> D/FontScaleTest( 4408): Diff in scale width. 100% = 924.1499 69% = 900.1465
> diff = -24.003418
>
> Do you think this is bug in android or I am not using it the correct way.
>
> I tried this with turned on and off hardware acceleration but there is no
> difference.
>
> Kaloyan
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en



-- 
Romain Guy
Android framework engineer
[email protected]

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

Reply via email to