是否可以在 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
我知道 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