2013-08-14 5 views
2

J'ai un problème lors de la mesure du texte à l'aide de la fonction skia measureText(). La valeur renvoyée est inexacte.SKIA - Valeur inexacte retournée par measureText()

SkPaint *skPaint = new SkPaint(); 

SkTypeface* myFont = SkTypeface::CreateFromName("Impact", SkTypeface::kNormal); 

skPaint->setTypeface(myFont); 
skPaint->setAntiAlias(true); 
skPaint->setTextAlign(SkPaint::kLeft_Align); 
skPaint->setTextEncoding(SkPaint::kUTF16_TextEncoding); 
skPaint->setTextSize(SkIntToScalar(120)); 
skPaint->setColor(0xff000001); 
canvas->drawText(text, length, SkIntToScalar(x) , SkIntToScalar(y) , *skPaint); 
SkScalar width = skPaint->measureText(text, length); 

La largeur retournée par measureText() est 451.

J'ai vérifié le texte bitmap généré via une application de retouche photo, la largeur réelle est seulement 438.

Toute réflexion sur l'obtention de la précision largeur du texte dans SKIA?

Merci!

+0

Qu'est-ce que le ** n ** là signifie .. ? – NREZ

+0

c'est une faute de frappe, édité – JayVDiyk

Répondre

4

Je crois que ce que vous essayez de faire correspondre viendra de « limites »

SkRect bounds; 
SkScalar textWidth = paint.measureText("some", 4, &bounds); 

qui est un rectangle minimum pour s'adapter à un texte donné, alors que textWidth est légèrement plus grand que cela.

1

J'ai aussi fait face à ce problème. Ne sais pas exactement pourquoi il arrive, peut-être en raison des différences crénage, mais je suis venu à ceci:

SizeF RenderTextAndroid::GetStringSizeF() { 
    UpdateFont(); 
    const base::string16& text = GetLayoutText(); 
    std::vector<SkScalar> widths(text.length()); 
    paint_.getTextWidths(text.c_str(), GetStrByteLen(text), &widths[0], NULL); 
    return SizeF(std::accumulate(widths.begin(), widths.end(), 0), 
     font_metrics_.fBottom - font_metrics_.fTop); 
} 

Où UpdateFont définit simplement de nouveaux paramètres à SkPaint

Questions connexes