热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android为TextView添加字体库和设置描边的方法

一、使用系统自带的字体 开发Android的人大多都知道,Android里面对字体的支持少得可怜,默认情况下,TextView 的 typ

一、使用系统自带的字体

开发Android的人大多都知道,Android里面对字体的支持少得可怜,默认情况下,TextView 的 typeface 属性支持 sans、serif和monospace 这三种字体,如果在没有指定字体的情况下,系统会使用 sans 作为文本显示的字体。但这三种字体只支持英文,也就是说只要你显示的文字是中文,无论你选择这三种字体中的哪一种,显示效果都是一样的。

1.在XML文件中设置










2.在Java代码中设置

第一步: 获取TextView实例

//获取textView实例
TextView textView = findViewById(R.id.textview);

第二步:设置字体

 //设置serif字体
 textView.setTypeface(Typeface.SERIF);
 //设置sans字体
 textView.setTypeface(Typeface.SANS_SERIF);
 //设置monospace字体
 textView.setTypeface(Typeface.MONOSPACE);

二、为TextView添加字体库

Android系统自带有对字体的设置,这些设置是对字体的显示方式的设置,比如加粗、倾斜、下划线、字号等,但是并没有提供对于字体类型的徐选择,比如设置成楷体、隶书或雅黑等。Android系统只固定默认一种字体类型,所以如果开发人员需要修改字体类型,那么就必须需自己引入字体库。

1.引入字体库的实现

第一步:在assets目录下新建fonts目录,并把ttf字体文件放到该目录下。

第二步:在Java代码中实现

//实例化TextView
TextView textView = findViewById(R.id.textview);

//得到AssetManager
AssetManager mgr=getAssets();

//根据路径得到Typeface
Typeface tf=Typeface.createFromAsset(mgr, "fonts/pocknum.ttf");

//设置字体
textView.setTypeface(tf);

2.引入字体库后的效果图

三、为TextView添加描边

Android的默认控件TextView,相信大家都不会陌生,但是原生的TextView是不支持描边效果的,但是在实际的开发过程中,经常会遇到为TextView添加描边的需求,因此就要对原生的TextView进行拓展,使其支持自定义内部和外部颜色的描边TextView。描边效果的实现原理其实很简单,无非就是获取到TextPaint类,先进行一次比默认大小的文字内容稍微大一点的绘制,然后再进行一次默认大小的文字内容的绘制,然后通过属性设置两种不同的颜色,这样就产生出了描边效果。

为TextView添加描边,要用到TextPaint的几个属性:

TextPaint paint = outlineTextView.getPaint(); //实例化TextPaint对象
paint.setStrokeWidth(15); //设置描边的宽度
paint.setStyle(Paint.Style.STROKE);//设置画笔属性为描边
strokeTextView.setTextColor(Color.parseColor(“#000000”)); //设置描边的颜色(不能与文本颜色一致)

其中strokeTextView为自定义TextView的实例,代码如下:

1.在构造函数中添加

public class StrokeTextView extends TextView { 
  private TextView outlineTextView = null; 
  
  public StrokeTextView(Context context) { 
    super(context); 
   
    outlineTextView = new TextView(context); 
    init(); 
  } 

  public StrokeTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
   
    outlineTextView = new TextView(context, attrs); 
    init(); 
  } 

  public StrokeTextView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
   
    outlineTextView = new TextView(context, attrs, defStyle); 
    init(); 
  } 

  public void init() { 
    TextPaint paint = outlineTextView.getPaint(); 
    paint.setStrokeWidth(3); //描边宽度 
    paint.setStyle(Style.STROKE); 
    outlineTextView.setTextColor(Color.parseColor("#000000")); //描边颜色 
    outlineTextView.setGravity(getGravity()); 
  } 

  @Override 
  public void setLayoutParams (ViewGroup.LayoutParams params) { 
    super.setLayoutParams(params); 
    outlineTextView.setLayoutParams(params); 
  } 

  @Override 
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
   
    //设置轮廓文字 
    CharSequence outlineText = outlineTextView.getText(); 
    if (outlineText == null || !outlineText.equals(this.getText())) { 
      outlineTextView.setText(getText()); 
      postInvalidate(); 
    } 
    outlineTextView.measure(widthMeasureSpec, heightMeasureSpec); 
  } 

  @Override 
  protected void onLayout (boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
    outlineTextView.layout(left, top, right, bottom); 
  } 

  @Override 
  protected void onDraw(Canvas canvas) { 
    outlineTextView.draw(canvas); 
    super.onDraw(canvas); 
  } 
} 

2.重写onDraw方法

public class StrokeTextView extends TextView {

  private TextView outlineTextView = null;
  private TextPaint strokePaint;

  public StrokeTextView(Context context) {
    super(context);

    outlineTextView = new TextView(context);
  }

  public StrokeTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    outlineTextView = new TextView(context, attrs);
  }

  public StrokeTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    outlineTextView = new TextView(context, attrs, defStyle);
  }

  @Override
  public void setLayoutParams (ViewGroup.LayoutParams params) {
    super.setLayoutParams(params);
    outlineTextView.setLayoutParams(params);
  }

  @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    AssetManager manager = context.getAssets();
    String path = "fonts/new_text.ttf";
    Typeface type = Typeface.createFromAsset(manager, path);

    //设置轮廓文字
    CharSequence outlineText = outlineTextView.getText();
    if (outlineText == null || !outlineText.equals(this.getText())) {
      outlineTextView.setText(getText());
      outlineTextView.setTypeface(type);
      setTypeface(type);
      postInvalidate();
    }
    outlineTextView.measure(widthMeasureSpec, heightMeasureSpec);
  }

  @Override
  protected void onLayout (boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    outlineTextView.layout(left, top, right, bottom);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    AssetManager manager = context.getAssets();
    String path = "fonts/new_text.ttf";
    Typeface type = Typeface.createFromAsset(manager, path);

    if (strokePaint == null) {
      strokePaint = new TextPaint();
    }
    //复制原来TextViewg画笔中的一些参数
    TextPaint paint = getPaint();
    strokePaint.setTextSize(paint.getTextSize());
    strokePaint.setTypeface(type);
    strokePaint.setFlags(paint.getFlags());
    strokePaint.setAlpha(paint.getAlpha());

    //自定义描边效果
    strokePaint.setStyle(Paint.Style.STROKE);
    strokePaint.setColor(Color.parseColor("#000000"));
    strokePaint.setStrokeWidth(4);

    String text = getText().toString();

    //在文本底层画出带描边的文本
    canvas.drawText(text, (getWidth() - strokePaint.measureText(text)) / 2,
        getBaseline(), strokePaint);
    super.onDraw(canvas);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 本文详细介绍了如何使用 PHP 接收并处理微信支付的回调结果,确保支付通知能够被正确接收和响应。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 理解UML的重要性及其应用
    探讨为什么大多数开发人员难以成为架构师,介绍从现实世界到业务模型的抽象过程,并详细解释UML在软件设计中的关键作用。 ... [详细]
  • ABBYY FineReader:高效PDF转换、精准OCR识别与文档对比工具
    在处理PDF转换和OCR识别时,您是否遇到过格式混乱、识别率低或图表无法正常识别的问题?ABBYY FineReader以其强大的功能和高精度的识别技术,完美解决这些问题,帮助您轻松找到最终版文档。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • HTML基础入门指南
    本文将深入浅出地介绍HTML的基础知识,包括其定义、开发工具、制定机构、特性、基本标签及更多实用内容。 ... [详细]
  • 深入解析AUTOSAR方法论:汽车电子系统开发的理论基础(第三部分)
    本文详细探讨了AUTOSAR方法论在汽车电子软件系统开发中的应用,涵盖了从系统配置到生成可执行代码的各个关键步骤。通过介绍各阶段的任务和工具支持,帮助读者全面理解AUTOSAR的设计流程。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
化合价steuart_968
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有