package com.ivankocijan.magicviews;

import android.content.Context;

import android.content.res.AssetManager;

import android.graphics.Typeface;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Hashtable;

import java.util.List;

/**

* Created by ivankocijan on 17.05.2014.

*/

public final class MagicFont {

private AssetManager am;

//list which contains all asset folders

private ArrayList assetFolders;

//key = font name, value = fontPath

private static final Hashtable fonts = new Hashtable();

private static Context ctx;

private static MagicFont magicFont;

private static MagicFont getInstance (Context context) {

if (magicFont == null) {

magicFont = new MagicFont();

}

ctx = context;

return magicFont;

}

private MagicFont () {

}

/**

* Call this method to initialize app typefaces.

*

* @param typefaces typeface name. For example "cha_chicle.otf"

*/

void initTypefaces (String... typefaces) {

am = ctx.getResources().getAssets();

if (assetFolders == null) {

assetFolders = new ArrayList();

assetFolders.add(""); //root folder also needs to be checked

getAssetFolders("");

}

setUpFonts(typefaces);

}

private void setUpFonts (String... typefaces) {

for (String typeface : typefaces) {

boolean fontFound = findFontInAssets(typeface);

if (!fontFound) {

throw new FontNotFoundException("Font " + typeface + " not found");

}

}

}

private boolean findFontInAssets (String typeface) {

try {

List mapList;

for (String assetFolder : assetFolders) {

mapList = Arrays.asList(am.list(assetFolder));

if (mapList.contains(typeface)) {

String fontPath;

if (assetFolder.isEmpty()) {

fontPath = typeface;

} else {

fontPath = assetFolder + "/" + typeface;

}

Typeface font = Typeface.createFromAsset(am, fontPath);

fonts.put(typeface, font);

return true;

}

}

} catch (IOException e) {

return false;

}

return false;

}

/**

* This method goes through all assets folders and adds them to @assetFolders object

*

* @param path

* @return

*/

private boolean getAssetFolders (String path) {

String[] list;

try {

list = ctx.getResources().getAssets().list(path);

if (list.length > 0) {

// This is a folder

for (String file : list) {

assetFolders.add(file);

if (!getAssetFolders(path + "/" + file))

return false;

}

}

} catch (IOException e) {

return false;

}

return true;

}

/**

* Returns requested typeface. If this class is not initialized it will try to initialaze it and return

* requested font

*

* @param ctx

* @param typeface

* @return

*/

public static Typeface getTypeface (Context ctx, String typeface) {

if (!fonts.containsKey(typeface)) {

MagicFont.getInstance(ctx).initTypefaces(typeface);

}

return fonts.get(typeface);

}

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐