使用TextView显示ImageView效果

可以解决图标适配、同种图标不同颜色、大小问题;可以携带字体。

一、矢量图标及其编号和字体库的准备

http://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.1.MeYAlv

阿里的矢量图库,可下载,可自定义上传图标;选择下载代码,在下载文件中可以选择打开.html文件,查看图标对应字符设置。


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>IconFont</title>
    <link rel="stylesheet" href="demo.css">

    <style type="text/css">

        @font-face {font-family: "iconfont";
          src: url('iconfont.eot'); /* IE9*/
          src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */
          url('iconfont.woff') format('woff'), /* chrome, firefox */
          url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
          url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
        }

        .iconfont {
          font-family:"iconfont" !important;
          font-size:16px;
          font-style:normal;
          -webkit-font-smoothing: antialiased;
          -webkit-text-stroke-width: 0.2px;
          -moz-osx-font-smoothing: grayscale;
        }

    </style>
</head>
<body>
    <div class="main markdown">
        <h1>IconFont 图标</h1>
        <ul class="icon_lists clear">
            
                <li>
                <i class="icon iconfont">&#xf0343;</i>
                    <div class="name">分享</div>
                    <div class="code">&amp;#xf0343;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xf0344;</i>
                    <div class="name">日历1</div>
                    <div class="code">&amp;#xf0344;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xf0345;</i>
                    <div class="name">票房</div>
                    <div class="code">&amp;#xf0345;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xf0346;</i>
                    <div class="name">返回</div>
                    <div class="code">&amp;#xf0346;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xf0347;</i>
                    <div class="name">日历2</div>
                    <div class="code">&amp;#xf0347;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xf0348;</i>
                    <div class="name">更多</div>
                    <div class="code">&amp;#xf0348;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xf0349;</i>
                    <div class="name">日历4</div>
                    <div class="code">&amp;#xf0349;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xf034a;</i>
                    <div class="name">日历3</div>
                    <div class="code">&amp;#xf034a;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xe602;</i>
                    <div class="name">评价-01</div>
                    <div class="code">&amp;#xe602;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xe604;</i>
                    <div class="name">搜索-01</div>
                    <div class="code">&amp;#xe604;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xe607;</i>
                    <div class="name">添加-01</div>
                    <div class="code">&amp;#xe607;</div>
                </li>
            
                <li>
                <i class="icon iconfont">&#xe608;</i>
                    <div class="name">系统管理-01</div>
                    <div class="code">&amp;#xe608;</div>
                </li>
            
        </ul>
        <h2 id="unicode-">unicode引用</h2>
        <hr>

        <p>unicode是字体在网页端最原始的应用方式,特点是:</p>
        <ul>
        <li>兼容性最好,支持ie6+,及所有现代浏览器。</li>
        <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
        <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li>
        </ul>
        <blockquote>
        <p>注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式</p>
        </blockquote>
        <p>unicode使用步骤如下:</p>
        <h3 id="-font-face">第一步:拷贝项目下面生成的font-face</h3>
        <pre><code class="lang-js hljs javascript">@font-face {
  font-family: <span class="hljs-string">'iconfont'</span>;
  src: url(<span class="hljs-string">'iconfont.eot'</span>);
  src: url(<span class="hljs-string">'iconfont.eot?#iefix'</span>) format(<span class="hljs-string">'embedded-opentype'</span>),
  url(<span class="hljs-string">'iconfont.woff'</span>) format(<span class="hljs-string">'woff'</span>),
  url(<span class="hljs-string">'iconfont.ttf'</span>) format(<span class="hljs-string">'truetype'</span>),
  url(<span class="hljs-string">'iconfont.svg#iconfont'</span>) format(<span class="hljs-string">'svg'</span>);
}
</code></pre>
        <h3 id="-iconfont-">第二步:定义使用iconfont的样式</h3>
        <pre><code class="lang-js hljs javascript">.iconfont{
  font-family:<span class="hljs-string">"iconfont"</span> !important;
  font-size:<span class="hljs-number">16</span>px;font-style:normal;
  -webkit-font-smoothing: antialiased;
  -webkit-text-stroke-width: <span class="hljs-number">0.2</span>px;
  -moz-osx-font-smoothing: grayscale;
}
</code></pre>
        <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
        <pre><code class="lang-js hljs javascript">&lt;i <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"iconfont"</span>&gt;&amp;#x33;<span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span></span></code></pre>

        <blockquote>
        <p>"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p>
        </blockquote>
    </div>


</body>
</html>

二、在studio工程java、src同级目录下建立assets文件夹,在其下面建立fonts文件夹,将下载的.ttf文件放入。

对全局的textview进行设置字体工具类

方式一、使用IconFontLayoutFactory 在Activity中LayoutInflaterCompat.setFactory进行设置

public class IconFontLayoutFactory implements LayoutInflaterFactory{

    private static Typeface mTypeface;
    private AppCompatDelegate mAppCompatDelegate;

    public IconFontLayoutFactory(Context context ,AppCompatDelegate appCompatDelegate){

        if(mTypeface==null) mTypeface=Typeface.createFromAsset(context.getAssets(),"fonts/fontawesome-webfont.ttf");
        mAppCompatDelegate=appCompatDelegate;
    }

    @Override
    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {

        View view=mAppCompatDelegate.createView(parent,name,context,attrs);

        if(view instanceof TextView){

            ((TextView)view).setTypeface(mTypeface);
        }

        return view;
    }

}

对于全局来说,一般有个BaseActivity.class;简单设置一个,对于所有子类都可以设置。

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       LayoutInflaterCompat.setFactory(getLayoutInflater(), new IconFontLayoutFactory(this, getDelegate()));
        super.onCreate(savedInstanceState);

        initDatas();
        initViews();

    }

    protected void initDatas() {
    }

    protected void initViews() {
    
    }
}

LayoutInflaterCompat.setFactory(getLayoutInflater(), new IconFontLayoutFactory(this, getDelegate()));

注意上面这句代码需要放到 super.onCreate(savedInstanceState)的前面

在xml中布局使用

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="&#xf0a9;" />


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello world &#xf242;" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:text="&#xf206;" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="40sp"
    android:textColor="#FF00FF00"
    android:text="&#xf206;" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#FFFF0000"
    android:text="&#xf206;" />

方式二、与方式一的主要区别就是对布局View递归的判断处理和使用内部Api处理View问题

public class FontHelper {

   public static final String FONTS_DIR = "fonts/";
   public static final String DEF_FONT = FONTS_DIR + "fontawesome-webfont.ttf";

   public static final void injectFont(View rootView) {

      injectFont(rootView, Typeface.createFromAsset(rootView.getContext().getAssets(), DEF_FONT));
   }

   public static final void injectFont(View rootView, Typeface tf) {
      if (rootView instanceof ViewGroup) {
         ViewGroup group = (ViewGroup) rootView;
         int count = group.getChildCount();
         for (int i = 0; i < count; i++) {
            injectFont(group.getChildAt(i), tf);
         }
      } else if (rootView instanceof TextView) {
         ((TextView) rootView).setTypeface(tf);
      }
   }

}

使用在actiivty中调用,两种方式运行效果相同。

FontHelper.injectFont(findViewById(R.id.ll));这个需要在加载布局的后面使用。

https://github.com/Qishuichixi/IconFontDemo

此文只为记录,向大神致敬

http://blog.csdn.net/qibin0506/article/details/48675839

http://mp.weixin.qq.com/s/VCTPXO49dp2x3w7tOFPvvw

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3015461/blog/915409

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值