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

Is it possible to use fancy fonts in Android?

我知道 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支持什么字体?只有宋体是不可能的吧?

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

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

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

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

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

    }

并在您的值文件夹中创建资源文件 attrs.xml(如果未创建)并添加:

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

所有艰苦的工作都是 done.Now 您可以在 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 是我的自定义文本视图。

你应该这样做

首先创建一个名为 assets 的文件夹,然后在其中创建另一个名为 fonts 的文件夹,现在将一些 .ttf 字体文件粘贴到其中假设您的文件名为 neutra_bold.ttf

现在创建一个 class 扩展 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"
                 />

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

Calligraphy by Christopher Jenkins

Blog post summarising his architecture

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

我建议您使用它,因为 重新发明轮子 没有意义,并且库在不断改进,因此您可以在所有其他项目中依赖它还有!

希望对您有所帮助! :)

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

设置字体是通过编程来完成的:

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

或否则创建 CustomText Class

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" />

Android 的 TextView 小部件是您无法在 XML 布局中指定 custom 字体. 您只需要从网上下载所需的字体,然后将其放在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 .For more details Using-custom-fonts-in-your-android-apps And Custom Fonts on Android — Extending TextView