android的自定义字体,Android自定义字体-适用于系统组件,例如Acti...

使用这样的自定义字体创建视图

FontManager.java

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;

import android.content.res.XmlResourceParser;

import android.graphics.Typeface;

import android.view.InflateException;

public class FontManager

{

//Making FontManager a singleton class

private static class InstanceHolder

{

private static final FontManager INSTANCE = new FontManager();

}

public static FontManager getInstance()

{

return FontManager.InstanceHolder.INSTANCE;

}

private FontManager()

{

}

// Different tags used in XML file.

private static final String TAG_FAMILY = "family";

private static final String TAG_NAMESET = "nameset";

private static final String TAG_NAME = "name";

private static final String TAG_FILESET = "fileset";

private static final String TAG_FILE = "file";

// Different styles supported.

private static final String STYLE_BOLD = "-Bold.ttf";

private static final String STYLE_ITALIC = "-Italic.ttf";

private static final String STYLE_BOLDITALIC = "-BoldItalic.ttf";

private class FontStyle

{

int style;

Typeface font;

}

private class Font

{

// different font-family names that this Font will respond to.

List families;

// different styles for this font.

List styles;

}

private List mFonts;

//private boolean isFamilySet = false;

private boolean isName = false;

private boolean isFile = false;

// Parse the resId and initialize the parser.

public void initialize(Context context, int resId)

{

XmlResourceParser parser = null;

try

{

parser = context.getResources().getXml(resId);

mFonts = new ArrayList();

String tag;

int eventType = parser.getEventType();

Font font = null;

do

{

tag = parser.getName();

switch ( eventType )

{

case XmlPullParser.START_TAG:

if ( tag.equals(TAG_FAMILY) )

{

// one of the font-families.

font = new Font();

}

else if ( tag.equals(TAG_NAMESET) )

{

// a list of font-family names supported.

font.families = new ArrayList();

}

else if ( tag.equals(TAG_NAME) )

{

isName = true;

}

else if ( tag.equals(TAG_FILESET) )

{

// a list of files specifying the different styles.

font.styles = new ArrayList();

}

else if ( tag.equals(TAG_FILE) )

{

isFile = true;

}

break;

case XmlPullParser.END_TAG:

if ( tag.equals(TAG_FAMILY) )

{

// add it to the list.

if ( font != null )

{

mFonts.add(font);

font = null;

}

}

else if ( tag.equals(TAG_NAME) )

{

isName = false;

}

else if ( tag.equals(TAG_FILE) )

{

isFile = false;

}

break;

case XmlPullParser.TEXT:

String text = parser.getText();

if ( isName )

{

// value is a name, add it to list of family-names.

if ( font.families != null )

font.families.add(text);

}

else if ( isFile )

{

// value is a file, add it to the proper kind.

FontStyle fontStyle = new FontStyle();

fontStyle.font = Typeface.createFromAsset(context.getAssets(), text);

if ( text.endsWith(STYLE_BOLD) )

fontStyle.style = Typeface.BOLD;

else if ( text.endsWith(STYLE_ITALIC) )

fontStyle.style = Typeface.ITALIC;

else if ( text.endsWith(STYLE_BOLDITALIC) )

fontStyle.style = Typeface.BOLD_ITALIC;

else

fontStyle.style = Typeface.NORMAL;

font.styles.add(fontStyle);

}

}

eventType = parser.next();

}

while ( eventType != XmlPullParser.END_DOCUMENT );

}

catch ( XmlPullParserException e )

{

throw new InflateException("Error inflating font XML", e);

}

catch ( IOException e )

{

throw new InflateException("Error inflating font XML", e);

}

finally

{

if ( parser != null )

parser.close();

}

}

public Typeface get(String family, int style)

{

for ( Font font : mFonts )

{

for ( String familyName : font.families )

{

if ( familyName.equals(family) )

{

// if no style in specified, return normal style.

if ( style == -1 )

style = Typeface.NORMAL;

for ( FontStyle fontStyle : font.styles )

{

if ( fontStyle.style == style )

return fontStyle.font;

}

}

}

}

return null;

}

}

RES /值/ Fonts.xml

RES / XML / fonts.xml

Arial

fonts/Arial-Regular.ttf

fonts/Arial-Bold.ttf

fonts/Arial-Italic.ttf

fonts/Arial-BoldItalic.ttf

在素材资源/字体中添加字体

Arial-Bold.ttf

Arial-BoldItalic.ttf

Arial-Italic.ttf

Arial-Regular.ttf

创建您的自定义视图,例如:FontableTextView.java

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.widget.TextView;

public class FontableTextView extends TextView

{

private static final String TAG = "FontableTextView";

public FontableTextView(Context context)

{

super(context);

}

public FontableTextView(Context context, AttributeSet attrs)

{

super(context, attrs);

setCustomFont(context, attrs);

}

public FontableTextView(Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle);

setCustomFont(context, attrs);

}

/*

* @see android.widget.CompoundButton#onDraw(android.graphics.Canvas)

*/

@Override

protected void onDraw(Canvas canvas)

{

super.onDraw(canvas);

}

private void setCustomFont(Context ctx, AttributeSet attrs)

{

// Fonts work as a combination of particular family and the style.

TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.Fonts);

String family = a.getString(R.styleable.Fonts_font);

int style = a.getInt(R.styleable.Fonts_android_textStyle, -1);

a.recycle();

// Set the typeface based on the family and the style combination.

if ( family != null )

{

setTypeface(FontManager.getInstance().get(family, style));

}

}

}

在MainActivity开始时启动FontManager以设置自定义字体

FontManager.getInstance().initialize(getApplicationContext(), R.xml.fonts);

在布局XML中使用自定义视图

xmlns:custom="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:layout_marginTop="20dip"

android:text="FontableTextView"

android:textStyle="bold"

custom:font="Arial" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值