旧的apis上的文字(字体)看起来很褪色

时间:2014-03-11 22:20:13

标签: android textview android-typeface

我使用的是自定义字体,它在新的Android版本上完美显示(在API 17(华硕标签),18(戴尔标签),19(Nex4) - 设备上测试)。但是,旧版本的相同字体看起来褪色(可能是扭曲的?) - API 8(SE X10i),10(LG P500H)。

这是一个比较,如果我的解释没有意义:

关于nex4:

enter image description here

关于x10i:

enter image description here

我使用的是Typeface.BOLD的自定义字体:

tvTitle.setTypeface(titleAndBodyFont, Typeface.BOLD);

身体(“看起来*”部分):

tvBody.setTypeface(titleAndBodyFont);

标题的XML声明:

<TextView
    android:id="@+id/tvTitle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/margin_title_side"
    android:layout_marginRight="@dimen/margin_title_side"
    android:layout_marginTop="@dimen/margin_title_top"
    android:ellipsize="end"
    android:maxLines="1"
    android:textColor="@color/constant_color"
    android:textSize="@dimen/text_size_title" />

tvBody以类似的方式宣布。

这是一个已知的错误吗?如果是这样,有人可以帮我找到错误报告吗?这将有助于了解这个版本的修复版本。如果没有,我会很感激解决方案。

谢谢大家。

2 个答案:

答案 0 :(得分:2)

我总是使用2种字体,1种普通字体和1种粗体字体。因此,当您需要加粗时,只需更改字体即可。从来没有遇到过问题,您也可以创建自定义textviewplus。

这样的事情:

/res/values/attrs.xml

<resources>   
<attr name="fontFamily" format="enum">
    <enum name="helvetica" value="0"/>
    <enum name="helvetica_bold" value="1"/>
</attr>

你的TextViewPlus:

public class TextViewPlus extends TextView{

private static final String TAG = "TextViewPlus";

public TextViewPlus(Context context) {
    super(context);
}

public TextViewPlus(Context context, AttributeSet attrs) {
    super(context, attrs);
    setCustomFont(context, attrs);
}

public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setCustomFont(context, attrs);
}

private void setCustomFont(Context ctx, AttributeSet attrs) {
    TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
    int customFont = a.getInt(R.styleable.TextViewPlus_fontFamily, -1);
    setCustomFont(ctx, customFont);
    a.recycle();
}

public boolean setCustomFont(Context ctx, int font) {
    Typeface tf = null;
    try {
    tf = Typefaces.get(ctx, font);  
    } catch (Exception e) {
        Log.e(TAG, "Could not get typeface: "+e.getMessage());
        return false;
    }

    setTypeface(tf);  
    return true;
}

public boolean setCustomFont(Context ctx, String asset) {
    Typeface tf = null;
    try {
    tf = Typefaces.get(ctx, asset);  
    } catch (Exception e) {
        Log.e(TAG, "Could not get typeface: "+e.getMessage());
        return false;
    }

    setTypeface(tf);
    return true;
}

}

使用方法:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.myapp"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
        <com.myapp.viewhelpers.TextViewPlus 
        app:fontFamily="helvetica"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:fontFamily="helvetica"
        android:text="helo world"/>

答案 1 :(得分:1)

我真的无法帮助你,绝对看起来像一个bug,但要查看bug扩展,你可能会觉得这个测试很有用:

        public class TestBoldText extends View {

            private TextPaint mPaint;

            public TestBoldText(Context context, AttributeSet attrs) {

                super(context, attrs);

                mPaint = new TextPaint(); 


                mPaint.setAntiAlias(true);
                mPaint.setFakeBoldText(true);
                mPaint.setFlags(mPaint.getFlags()|Paint.SUBPIXEL_TEXT_FLAG);

            }

            @Override
            protected void onDraw(Canvas canvas) {

                super.onDraw(canvas);
                canvas.drawText("i am a bold text!", 0, 0, mPaint)

            }

        }

看起来Android使用&#34;假冒大胆&#34;绘制粗体文本的方法,而不是字体的特定粗体版本。我想他们用像素偏移绘制相同的文本。这个测试在我的设备中使用API​​&gt; = ICS(三星galaxy / amazon kindle)绘制了可接受的粗体文本,但我很想知道它是否也在你的设备中失败,因为我正在做一个wysiwig编辑器

此外,mPaint.setStrokeWidth应更改文字行宽。我想用setStrokeWidth / setAntiAlias / setFakeBoldText玩你可以在旧的API中获得一个不错的粗体文本,但我也想知道为什么结果不一样......

祝你好运!