Android 4.0(冰淇淋三明治)上的自定义字体渲染

时间:2012-01-27 15:56:40

标签: android typeface

在Android 4.0上测试使用Helvetica Neue作为主要字体的应用程序时,我发现与多个不同版本的Android相比,字体呈现存在不一致。我们在2.1,2.2.2,2.3.5,3.2,4.0和4.0.3上对此进行了测试,每次都得到相同的结果。我们还使用不同的字体二进制文件进行了这些测试,结果相同。

任何输入或解决方法都将受到赞赏。

下面是一个示例应用程序的屏幕截图,显示了不需要的结果,第一个是2.3.5,第二个是4.0.3。

2.3.5

4.0.3

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView textView = new TextView(this);
    textView.setText("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
    textView.setTypeface(Typeface.createFromAsset(getAssets(), "Helvetica Neue.ttf"));
    textView.setTextSize(9);
    setContentView(textView);
}

4 个答案:

答案 0 :(得分:8)

虽然我们从未找到Helvetica渲染错误的解决方案,但我们能够说服客户在向Galaxy Nexus显示错误之后切换到Roboto。


更新

public class TextViewCompat extends TextView {

    public TextViewCompat(Context context) {
        super(context);
        setup(context, null, 0);
    }

    public TextViewCompat(Context context, AttributeSet attrs) {
        super(context, attrs);
        setup(context, attrs, 0);
    }

    public TextViewCompat(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setup(context, attrs, defStyle);
    }

    private void setup(Context context, AttributeSet attrs, int defStyle) {
        setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}

答案 1 :(得分:0)

将字体类型ttf文件添加到资产文件夹,然后添加以下代码

字体tf = Typeface.createFromAsset(getBaseContext()。getAssets(),                     “Helvetica.ttf”);

然后将tf对象添加到文本视图中,如下所示

textobjext.setTypeface(tf, Typeface.BOLD);

答案 2 :(得分:0)

在播放了一些之后,我无法再现你所看到的内容。

让我相信你使用的字体很糟糕。

我根据我的其他答案设置了所有字体,这对我来说很好,请看屏幕:

所以顶部文字是Roboto-Normal 然后下面的文字是Roboto-Light,<b></b>使其强大

3个版本,3种不同的屏幕尺寸,两种密度,手动设置字体。相同的渲染。不确定你是如何得到你所看到的。你尝试过不同的字体吗?

如果可能有帮助,我会提供一些我正在做的事情的例子吗?

Android 2.2

Android 2.3

Android 4.0.3

答案 3 :(得分:-2)

ICS v14 +使用此处的Roboto字体:Android design

如果要在所有版本中显示相同的面,最好手动设置类型面。

Typeface mBoldType = Typeface.createFromAsset(getAssets(), "fonts/Roboto-Bold.ttf");
TextView mTextView = findById(R.id.text1);
mTextView.setTypeface(mBoldType);

不幸的是,没有快速的方法在xml中为自定义字体执行此操作,但是正确编写的Helper类应该可以满足您的需要。

如果您需要示例功能,请与我们联系。

应该注意的是,如果你设置一个自定义字体,像android:fontStyle这样的东西将不起作用,即你需要一个粗体字体,斜体字体等。