【问题标题】:Samsung devices supporting setTypeface(Typeface.Italic)?支持 setTypeface(Typeface.Italic) 的三星设备?
【发布时间】:2015-10-06 23:10:29
【问题描述】:

我在应用程序中使用了自定义视图组件,该组件通过 Paint/Canvas 在屏幕上绘制一些文本。

我正在使用以下代码(在调用 canvas.drawText() 之前)使我的文本变为斜体:

mPaintText.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));

这适用于三星 Galaxy Nexus。但在 Samsung Epic 4g (galaxy S)、Samsung Epic Touch (Galaxy SII) 和 Samsung Transform ultra 上,我的文字仍然不是斜体。

有谁知道为什么有些三星设备不支持这样设置斜体文本?我知道这些设备能够呈现斜体文本,因为如果我有一个 TextView 我可以使用任何一个

tv.setText(Html.fromHtml("<i>sometext</i>");

在java中或

android:textStyle="italic"

在 layout.xml 中,我的文本显示为斜体。

有谁知道我可以设置画布的 drawText() 方法以绘制可能在这些设备上工作的斜体文本的另一种方法?

编辑:

以下是我在 cmets 中尝试过的一些方法的列表。事实证明,SERIF 似乎是唯一可以使用的字体。

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

再次编辑:为了实现这个功能,我最终将斜体版的 Roboto 字体添加到我的资产文件夹中,并将其作为字体应用。如果有人找到一种方法让它工作而不以这种方式添加它,我仍然会感兴趣。

【问题讨论】:

  • 你用什么字体给你这种效果?
  • 无论在各自的设备上有什么库存,我都没有更改字体。
  • 尝试将直接值传递给setTypeface 方法..
  • 仅供参考,我的 Galaxy SII 现已升级到 4.0.3 并且 paint.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)) 以斜体显示 OK。

标签: android typeface italic


【解决方案1】:

您的三星设备可能没有安装所需字体的原生斜体版本。您可能必须强制系统综合创建斜体样式字体。试试:

tv.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC), Typeface.ITALIC);

编辑

尝试使用Typeface.create (Typeface family, int style)(记录在here),而不是defaultFromStyle

【讨论】:

  • 但我正在尝试将其应用于使用 Canvas / Paint 对象绘制的文本。而且 Paint.setTypeface() 只接受一个参数,而不是两个...
  • 刚刚测试了很多输入到 .create() 结果的可能排列已添加到问题中。
  • 可能是三星 Android 实现中的一个错误...这是哪个操作系统版本?
  • 变形与史诗触控(Galaxy S2) = 2.3.4,普通史诗 (Galaxy S) = 2.3.6
【解决方案2】:

尝试将直接值传递给setTypeFace api,直到找到正确的。如果斜体是通过其他方法进行的,那么TypeFace 类(在那些构建中)中的常量定义可能存在一些问题。

mPaintText.setTypeface(Typeface.defaultFromStyle(0)); // then 1, 2, 3

【讨论】:

  • 如果我开始更改这些值,是不是会在它工作的设备上破坏它? (银河系)
  • 只是为了调查,试试看..至少你会知道问题的根源..我们可以想到一个解决方案..
  • 设备正在工作,明天试试。我发现了一些可行但不理想的东西。我找到了斜体系统字体的副本并将其包含在我的项目中,如果我在我的资产中将字体设置为该文件,它会正确显示在相关设备的屏幕上。
  • 你找到问题的根源了吗..?
  • 不,我尝试使用几个原始 int 值进行替换,但没有任何新内容。
【解决方案3】:

这是三星的一个错误,正如 FomayGuy 所说,最好的解决方案是将系统字体的斜体版本添加到资产中。

Roboto Android 官方字体可用here

【讨论】:

    【解决方案4】:

    我们需要检查默认字体是否支持斜体模式。我们通过创建一个临时 TextView 对象并在两种模式(NORMAL 和 ITALIC)下测量其宽度来做到这一点。如果它们的宽度不同,则表示支持斜体模式。否则,默认字体不支持它,我们必须使用 setTextSkewX() 方法来倾斜文本。

        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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2016-10-29
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多