
androID系统内置字体
androID 系统本身内置了一些字体,可以在程序中使用,并且支持在xml配置textVIEw的时候进行修改字体的样式。支持字段为androID:textStyle,androID:typeface,androID:FontFamily,系统内置了normal|bold|italic三种style,内置了normal,sans,serif,monospace,几种字体(实测这几种字体仅英文有效),typace和FontFamily功能一样。
使用自定义的字体
以上的方式可以改变字体的样式,还不是真正的自定义。androID系统支持TypeFace,即ttf的字体文件。我们可以在程序中放入ttf字体文件,在程序中使用Typeface设置字体。
第一步,在assets目录下新建Fonts目录,把ttf字体文件放到这。
第二步,程序中调用:
public class MainActivity extends AppCompatActivity { private TextVIEw textVIEw; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); textVIEw= (TextVIEw) findVIEwByID(R.ID.text); AssetManager assets = getAssets(); Typeface fromAsset = Typeface.createFromAsset(assets,"Fonts/fzlt.ttf"); textVIEw.setTypeface(fromAsset); }}注意ttf文件命名不能使用中文,否则可能无法加载。
对于需要使用比较多的地方,可以写一个TextVIEw的子类来统一处理。
public class CustomTextVIEw extends TextVIEw { public CustomTextVIEw(Context context) { super(context); // Todo auto-generated constructor stub } public CustomTextVIEw(Context context,AttributeSet attrs) { super(context,attrs); // Todo auto-generated constructor stub } public CustomTextVIEw(Context context,AttributeSet attrs,int defStyle) { super(context,attrs,defStyle); // Todo auto-generated constructor stub } public voID setTypeface(Typeface tf,int style) { super.setTypeface(AppContext.getInstance().getTypeface()); } }//初始化自定义字体
typeface = Typeface.createFromAsset(getAssets(),"Fonts/fzlt.ttf");
法还是有点缺点的:只能替换一类控件的字体,如果需要替换button或EditText控件的字体,需要以相同的方式自定义这些控件,这样工作量大,如何高效替换整个app中的字体,见下方参考资料。
在webvIEw中使用自定义的字体
对于本地的网页,在asset目录放字体文件,并在CSS中添加以下内容,自定义一个字体face,并且在需要的地方使用这个字体face即可。
<style>@Font-face { Font-family: 'myface'; src: url('file:///androID_asset/Fonts/fzlt.ttf');}body { margin: 0; @R_301_5095@: 0; Font-family:'myface','方正兰亭纤黑简体';}.textbar{ Box-sizing:border-Box; wIDth:100%; @R_301_5095@:5px;}.textbar p{ Font-size:16px; text-align:justify; color:#333;line-height:24px; margin:0 0 0 0;}.textbar h1{ Font-size:18px; margin:10px 0 10px 0;color:#000}</style>对于在线的网页,则需要把字体文件放到服务器,使用同样的方式定义字体face,应用到每个地方。
为了减少网页或者说服务器端的工作,可以使用本地注入的方式注入Font-face的CSS,并对整个网页进行样式替换。给webvIEw自定义webVIEwClIEnt,重写onPageFinish,在其中添加如下内容:
vIEw.loadUrl("JavaScript:!function(){" + "s=document.createElement('style');s.INNERHTML=" + "\"@Font-face{Font-family:myhyqh;src:url('**injection**/hyqh.ttf');}*{Font-family:myhyqh !important;}\";"+ "document.getElementsByTagname('head')[0].appendChild(s);" +"document.getElementsByTagname('body')[0].style.FontFamily = \"myhyqh\";}()"); //由于网页上是没有权限访问本地的asset文件夹的,因此我们需要拦截请求来加载本地的文件,我这里替换了`file://androID_assets/`为 `**injection**/`了,我们还需要重写`shouldInterceptRequest`//在请求为我们这个字体文件的时候,加载本地文件:@OverrIDepublic WebResourceResponse shouldInterceptRequest (WebVIEw vIEw,String url){ WebResourceResponse response = super.shouldInterceptRequest(vIEw,url); Log.i("load intercept request:" + url); if (url != null && url.contains("**injection**/")) { //String assertPath = url.replace("**injection**/",""); String assertPath = url.substring(url.indexOf("**injection**/") + "**injection**/".length(),url.length()); try { response = new WebResourceResponse("application/x-Font-ttf","UTF8",getAssets().open(assertPath)); } catch (IOException e) { e.printstacktrace(); } } return response;}感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android APP使用自定义字体实现方法全部内容,希望文章能够帮你解决Android APP使用自定义字体实现方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)