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