是否可以在Android中使用花哨的字体?

时间:2015-07-28 04:01:46

标签: android fonts xml-attribute

我知道TextView有一个名为fontFamily的属性,我认为您可以通过更改此属性的值来更改文本的字体。所以我写道:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="my text"
    android:fontFamily="OCR A Std"
    android:textSize="20pt"/>

然后我运行应用程序,但文本的字体仍然是普通的旧Arial字体。我认为必须是一种在android中使用花哨字体的方法,对吗?

如果我只是不能使用花哨字体,那么android支持哪些字体?只有Arial是不可能的,对吗?

5 个答案:

答案 0 :(得分:7)

你应该这样做

首先创建一个名为assets的文件夹并在其中创建另一个名为fonts的文件夹,现在将一些.ttf字体文件粘贴到其中,让我们说你的文件命名为neutra_bold.ttf

现在创建一个扩展TextView的类,例如。

package com.view9.costumviews;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class NeutraBoldTextView extends TextView {

    public NeutraBoldTextView(Context context) {
        super(context);
        Typeface face=Typeface.createFromAsset(context.getAssets(), "fonts/neutra_bold.ttf");
        this.setTypeface(face);
    }

    public NeutraBoldTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        Typeface face=Typeface.createFromAsset(context.getAssets(), "fonts/neutra_bold.ttf");
        this.setTypeface(face);
    }

    public NeutraBoldTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        Typeface face=Typeface.createFromAsset(context.getAssets(), "fonts/neutra_bold.ttf");
        this.setTypeface(face);
    }

    protected void onDraw (Canvas canvas) {
        super.onDraw(canvas);


    }

}

现在要使用此视图,您可以在xml布局中执行此操作

<com.view9.costumviews.NeutraBoldTextView

                android:id="@+id/tvViewAttachmentDescLabel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="20dp"
                android:ellipsize="end"
                android:maxLines="1"
                android:text="@string/text_description"
                android:textColor="@color/heading_text_color"
                 />

答案 1 :(得分:1)

您需要将字体文件放在assets文件夹中。 您需要将Textface添加到textview或任何其他视图,如下所示:

此方法适用于一个或几个视图,但对于多视图,它将复制代码。

Typeface type = Typeface.createFromAsset(getAssets(),"Kokila.ttf"); 
 txtyour.setTypeface(type);

更好的方法是使用您自己的字体管理器,如下所示:

public class QuickFontManager {

    private static int cacheSize=6;
    private static boolean debuggable=false;
    private static LruCache<String, Typeface> lruCache;


    private QuickFontManager(int cacheSize, boolean debuggable)
    {
        QuickFontManager.debuggable=debuggable;

        if(lruCache==null)
        {
            QuickFontManager.cacheSize=cacheSize;
            lruCache= new LruCache<String, Typeface>(cacheSize);

        }else
        {
            Log.e("QuickFonts","Cache already configured, use configuration before using typeface. Application class is a good contender.");
        }
    }

    public static void clearCache()
    {
        if(lruCache!=null)
        {
            lruCache.evictAll();
            lruCache=null;
        }
    }

    /**
     *
     * @param context
     * @param name
     * @return A pair containing required typeface and boolean value for whether it was fetched from cache.Boolean works only for debuggable mode.
     */
    public static Pair<Typeface, Boolean> getTypeface(Context context, String name) {

        if(lruCache==null)
        {
            lruCache= new LruCache<String, Typeface>(cacheSize);
        }

        Typeface typeface = lruCache.get(name);
        boolean fromCache=true;
        if (typeface == null) {
            try {
                typeface = Typeface.createFromAsset(context.getApplicationContext().getAssets(), name);
                fromCache=false;
            } catch (Exception e) {
                typeface=null;
            }

            if (typeface == null) {
                throw new NullPointerException("Resource named " + name + " not found in assets");
            } else
            {
                lruCache.put(name, typeface);
            }
        }
        if(!QuickFontManager.debuggable)
        {
            fromCache=true;  // User has not asked for debugging ,let's fool views
        }
        return Pair.create(typeface,fromCache);
    }




    public static class QuickFontBuilder
    {
        private int cacheSize;
        private boolean debuggable=false;
        public QuickFontBuilder()
        {

        }

        public QuickFontBuilder setCachesize(int cachesize)
        {
            this.cacheSize=cachesize;
            return this;
        }

        public QuickFontManager build()
        {
                return new QuickFontManager(this.cacheSize,this.debuggable);
        }

        public QuickFontBuilder setDebuggable(boolean debuggable) {
            this.debuggable = debuggable;
            return this;
        }
    }
}

然后创建自定义textview或任何其他视图(单选按钮,复选框等),如:

public class TextView extends android.widget.TextView {
    private String quickfont;
    public TextView(Context context) {
        super(context);
        init(null, 0);
    }

    public TextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }

    public TextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs, defStyle);
    }

    private void init(AttributeSet attrs, int defStyle) {
        // Load attributes
        final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TextView, defStyle, 0);
        try {
            quickfont = a.getString(R.styleable.TextView_quickfont);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            a.recycle();
        }
        if(quickfont!=null&!isInEditMode())
        {
            Pair<Typeface,Boolean> pair= QuickFontManager.getTypeface(getContext(), quickfont);
            Typeface typeface=pair.first;
            boolean fromCache=pair.second;

            if(typeface!=null)
            {
                setTypeface(typeface);
            }

            if(!fromCache)setTextColor(Color.RED);
        }

        // Note: This flag is required for proper typeface rendering
        setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);

    }

并在您的values文件夹中创建一个资源文件attrs.xml(如果没有创建)并添加:

<!--for custom views-->
<declare-styleable name="TextView">
    <attr name="quickfont" format="string" />
</declare-styleable>

所有的辛苦工作都已完成。现在您可以在xml中为任何视图(如

)简单地使用它
<com.abc.views.TextView
                app:quickfont="OpenSans-Regular_1.ttf"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="@android:color/white"
                />

看到我使用 app:quickfont 指定了字体。 OpenSans-Regular_1.ttf 是我在资源文件夹中的字体文件和 com.abc.views .TextView 是我的自定义文本视图。

答案 2 :(得分:1)

Android的 TextView 小部件是您无法在XML布局中指定custom字体。 您只需从Internet下载所需的字体,然后将其放在assets / fonts文件夹中。

将字体放在fonts文件夹下的assets文件夹中后,您可以通过Typeface class在java代码中访问它。首先,在代码中获取文本视图的引用。其语法如下 -

TextView tx = (TextView)findViewById(R.id.textview1);

您需要做的下一件事是调用Typeface class createFromAsset()的静态方法从资产中获取自定义字体。其语法如下 -

Typeface custom_font = Typeface.createFromAsset(getAssets(), "fonts/font name.ttf");

您需要做的最后一件事是将此自定义字体对象设置为TextView字体属性。您需要调用setTypeface()方法来执行此操作。其语法如下 -

tx.setTypeface(custom_font);

Reference。有关详细信息Using-custom-fonts-in-your-android-appsCustom Fonts on Android — Extending TextView

答案 3 :(得分:0)

我做了答案中提到的所有这些事情,但老实说,最简单的最方便的方法用于应用字体就是使用这个库。

Calligraphy by Christopher Jenkins

Blog post summarising his architecture

设置非常简单,支持所有情况。

我建议你使用它,因为没有必要重新发明轮子并且库不断改进,所以你也可以依赖它来完成所有其他项目!

希望它有所帮助! :)

答案 4 :(得分:0)

下载并复制字体文件(.ttf,.ttc,.otf等)到资产文件夹

设置字体是以编程方式执行的:

TextView tv= (TextView)findViewById(R.id.custom);
Typeface face=Typeface.createFromAsset(getAssets(), "fonts/heartbre.ttf");
tv.setTypeface(face);

或其他创建CustomText

public class CustomTextView extends TextView 
{
    Context context;
    String ttfName;
    String attrName ;
    String TAG = getClass().getName();
    public CustomTextView(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
        this.context = context;
        for (int i = 0; i < attrs.getAttributeCount(); i++) 
        {
            try 
            {
                    attrName = attrs.getAttributeName(i);
                    if(attrName.equals("fontFamily"))
                    {
                        this.ttfName = attrs.getAttributeValue(i);
                        Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/"+this.ttfName);
                        setTypeface(font);
                    }
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void setTypeface(Typeface tf) 
    {
        super.setTypeface(tf);
    }
}

您可以通过xml为示例

设置字体系列
 <com.gm.custom_classes.CustomTextView
        android:id="@+id/updater_invalid_vin_content"
        android:layout_width="629dp"
        android:layout_height="266dp"
        android:layout_marginLeft="86dp"
        android:layout_marginTop="91dp"
        android:fontFamily="GMSansUI_Light.ttf"
        android:gravity="left"
        android:maxLines="7"
        android:singleLine="false"
        android:text="@string/updater_invalid_vin_content"
        android:textColor="#ffffff"
        android:textSize="28sp" />