Android应用使用自定义字体

dl_genius 7年前
   <h2><strong>android系统内置字体</strong></h2>    <p>android 系统本身内置了一些字体,可以在程序中使用,并且支持在xml配置textView的时候进行修改字体的样式。支持字段为android:textStyle ,android:typeface, android:fontFamily,系统内置了normal|bold|italic三种style, 内置了normal,sans,serif,monospace,几种字体(实测这几种字体仅英文有效),typace和fontFamily功能一样。</p>    <h2><strong>使用自定义的字体</strong></h2>    <p>以上的方式可以改变字体的样式,还不是真正的自定义。android系统支持TypeFace,即ttf的字体文件。我们可以在程序中放入ttf字体文件,在程序中使用Typeface设置字体。</p>    <ul>     <li> <p>第一步,在assets目录下新建fonts目录,把ttf字体文件放到这。</p> </li>    </ul>    <p><img src="https://simg.open-open.com/show/18834b09e4c5f7df671218f6699771fe.png"></p>    <ul>     <li> <p>第二步,程序中调用:</p> </li>    </ul>    <pre>  <code class="language-java">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);      }  }</code></pre>    <p>注意ttf文件命名不能使用中文,否则可能无法加载。</p>    <h2><strong>对于需要使用比较多的地方,可以写一个TextView的子类来统一处理。</strong></h2>    <pre>  <code class="language-java">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());       }    }</code></pre>    <pre>  <code class="language-java">//初始化自定义字体  typeface = Typeface.createFromAsset(getAssets(), "fonts/fzlt.ttf");</code></pre>    <p>法还是有点缺点的:只能替换一类控件的字体,如果需要替换Button或EditText控件的字体,需要以相同的方式自定义这些控件,这样工作量大,如何高效替换整个app中的字体,见下方参考资料。</p>    <h2><strong>在webview中使用自定义的字体</strong></h2>    <ul>     <li> <p>对于本地的网页,在asset目录放字体文件,并在css中添加以下内容,自定义一个字体face,并且在需要的地方使用这个字体face即可。</p> </li>    </ul>    <pre>  <code class="language-java"><style>  @font-face {       font-family: 'myface';       src: url('file:///android_asset/fonts/fzlt.ttf');  }  body {       margin: 0;       padding: 0;       font-family:'myface','方正兰亭纤黑简体';  }  .textbar{ box-sizing:border-box; width:100%; padding: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></code></pre>    <ul>     <li> <p>对于在线的网页,则需要把字体文件放到服务器,使用同样的方式定义字体face,应用到每个地方。</p> </li>    </ul>    <p>为了减少网页或者说服务器端的工作,可以使用本地注入的方式注入font-face的css,并对整个网页进行样式替换。给webview自定义webViewClient,重写onPageFinish,在其中添加如下内容:</p>    <pre>  <code class="language-java">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`  //在请求为我们这个字体文件的时候,加载本地文件:  @Override  public 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;  }</code></pre>    <p> </p>    <p> </p>    <p>来自:http://www.androidchina.net/5600.html</p>    <p> </p>