问题
I have in application that makes use of a custom View component that drawas some text onto the screen via Paint/Canvas.
I am using the following code (before I call canvas.drawText()) to make my text Italic:
mPaintText.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
This works on Samsung Galaxy Nexus. But on Samsung Epic 4g (galaxy S), Samsung Epic Touch (Galaxy SII), and Samsung Transform ultra my text is still non-italic.
Does anyone know why some of these samsung devices wouldn't support setting italic text that way? I know the devices are capable of rendering the italic text because if I have a TextView I can use either
tv.setText(Html.fromHtml("<i>sometext</i>");
in java or
android:textStyle="italic"
in layout.xml and my text appears italic.
Does anyone know of another way that I can set the drawText() method of canvas to draw the text italicized that might work on these devices?
EDIT:
Here is a list of some ways I've tried it with their outcome in comments after. Turns out SERIF seems to be the only font that it works on.
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC) //Nothing
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT_BOLD, Typeface.ITALIC) //Nothing
mPaint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC) //omg it is italic...But serifs look gross.
mPaint.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC) //Nothing
mPaint.setTypeface(Typeface.create(Typeface.MONOSPACE, Typeface.ITALIC) //Changes font, but still no italic.
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD_ITALIC) //Bold but no italic
EDIT AGAIN: To make this function I ended up adding the italic version of the roboto font to my assets folder and applied it as a font. I'd still be interested if anyone ever finds a way to get it working without adding it this way.
回答1:
It may be that your Samsung device does not have a native italics version of the desired font installed. You may have to force the system to create the italics-style font synthetically. Try:
tv.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC),
Typeface.ITALIC
);
EDIT
Instead of defaultFromStyle
, try to use Typeface.create (Typeface family, int style)
(documented here).
回答2:
Try passing direct values to the setTypeFace
api till you find the right one. If italicizing is working through other methods then there could be some problem in constant definitions in TypeFace
class (in those builds).
mPaintText.setTypeface(Typeface.defaultFromStyle(0)); // then 1, 2, 3
回答3:
This is a bug from Samsung and the best solution is, as FomayGuy said, to add the italic version of the system font to the assets.
The official Roboto Android font is available here.
回答4:
We need to check whether a default font supports an ITALIC mode. We do it by creating a temporal TextView object and measuring its width in both modes (NORMAL and ITALIC). If their widths are different, then it means an ITALIC mode is supported. Otherwise, a default font doesn't support it and we have to use setTextSkewX() method to skew a text.
mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC));
// check whether a font supports an italic mode, returns false if it does't
if (!supportItalicMode(this, Typeface.DEFAULT))
{
paint.setTextSkewX(-0.25f);
}
private boolean supportItalicMode(Context context, Typeface typeFace)
{
Typeface tfNormal = Typeface.create(typeFace, Typeface.NORMAL);
Typeface tfItalic = Typeface.create(typeFace, Typeface.ITALIC);
TextView textView = new TextView(context);
textView.setText("Some sample text to check whether a font supports an italic mode");
textView.setTypeface(tfNormal);
textView.measure(0, 0);
int normalFontStyleSize = textView.getMeasuredWidth();
textView.setTypeface(tfItalic);
textView.measure(0, 0);
int italicFontStyleSize = textView.getMeasuredWidth();
return (normalFontStyleSize != italicFontStyleSize);
}
来源:https://stackoverflow.com/questions/10420077/samsung-devices-supporting-settypefacetypeface-italic