我知道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是不可能的,对吗?
答案 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-apps和Custom 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" />