热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android字间距实现,textview字间距实现

搜索了一下关于android字间距,文章很多,但是真正能用的很少,刚好今天有这样的需求,参考了一下网上其它人的写法,自己写了一个,顺便开放源代码,供大家参考。别人写的自定义的textv

搜索了一下关于android字间距,文章很多,但是真正能用的很少,刚好今天有这样的需求,参考了一下网上其它人的写法,自己写了一个,顺便开放源代码,供大家参考。

别人写的自定义的textview一般都有问题,少了一步计算textview控件的宽度的方法,少了一个计算文本居中对齐的方法所以写出来的文字是竖向排列的,

网上很多人说textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型。这是错误的。真正的字间距需要自己去继承textview实现。

package com.huifeng.bufu.widget;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.huifeng.bufu.R;
import com.huifeng.bufu.tools.Tool;

import android.content.Context;
import android.graphics.*;
import android.graphics.Paint.FontMetrics;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class MyTextView extends TextView {
	private Context context;
	private String content;
	private int Twidth;
	private int Lwidth;
	private int xstart;
	private TextPaint paint;
	private int xPadding;
	private int yPadding;
	private int textHeight;
	private int xPaddingMin;
	private String strr;
	int count;
	// 记录每个字的二维数组
	int[][] position;

	public MyTextView(Context context) {
		super(context);
		this.cOntext= context;
		init();
	}

	public MyTextView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		this.cOntext= context;
		init();
	}

	public MyTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.cOntext= context;
		init();
	}
	public void setText(String str) {
		//拿到你传进来的文本值
		this.strr=str;
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int widthMode = MeasureSpec.getMode(widthMeasureSpec);
		int widthSize = MeasureSpec.getSize(widthMeasureSpec);

		if (widthMode == MeasureSpec.EXACTLY
				|| widthMode == MeasureSpec.AT_MOST) {
			//获取你textview控件的宽,方便做文字对齐的,如果你的textview控件需要设置宽高,也是在这里设置的
			Lwidth = widthSize;
			Twidth = strr.length()*Tool.dpToPx(context, 30);//算出所有文本的总宽度,因为我这里就只有一行字,并且居中对齐
			xstart = (Lwidth-Twidth)/2;//算出第一个文字的其实位置
			Log.i("MyTextView", "Lwidth"+Lwidth);
			getPositions(strr);//获取每一个文字的位置信息
			this.postInvalidate();//绘制
		} else {

		}

	}

	public void init() {
		paint = new TextPaint();
		paint.setColor(getResources().getColor(R.color.red));
		paint.setTypeface(Typeface.DEFAULT);
		paint.setTextSize(Tool.dpToPx(context, 30));
		FontMetrics fm = paint.getFontMetrics();// 得到系统默认字体属性
		textHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);// 获得字体高度
		// 字间距
		xPadding = dip2px(this.getContext(), 4f);
		// 行间距
		yPadding = dip2px(this.getContext(), 10f);
		// 比较小的字间距(字母和数字应紧凑)
		xPaddingMin = dip2px(this.getContext(), 2f);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		 super.onDraw(canvas);
		 //画出每一个文字
		if (!TextUtils.isEmpty(content)) {
			for (int i = 0; i  Lwidth) {
				lineNum++;// 真实的行数加一
				x = xstart+Tool.dpToPx(context, 30)/2;
			} else {
				// 回到预判前的位置
				x -= textWith;
			}
			// 记录每一个字的位置
			position[i][0] = x;
			position[i][1] = textHeight * lineNum + yPadding * (lineNum - 1);
			Log.i("MyTextView", "position[i][1]"+position[i][0]);
			// 判断是否是数字还是字母 (数字和字母应该紧凑点)
			// 每次输入完毕 进入下一个输入位置准备就绪
			if (isNumOrLetters(str)) {
				x += textWith + xPaddingMin;
			} else {
				x += textWith + xPadding;
			}
		}
		// 根据所画的内容设置控件的高度
		this.setHeight((textHeight + yPadding) * lineNum);
	}

	// 工具类:判断是否是字母或者数字需要的话可以引用
	public boolean isNumOrLetters(String str) {
		String regEx = "^[A-Za-z0-9_]+$";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(str);
		return m.matches();
	}

	// 工具类:在代码中使用dp的方法(因为代码中直接用数字表示的是像素)
	public static int dip2px(Context context, float dip) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dip * scale + 0.5f);
	}

}

有一点需要注意,一下,给这个控件setText的时候,一定要调用这个控件的setText(String str),而不是调用textview的setText(CharSequence text)这个方法,否则无法显示自定义的文本间距。



推荐阅读
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 2021年最详细的Android屏幕适配方案汇总
    1Android屏幕适配的度量单位和相关概念建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章 ... [详细]
  • 通俗易懂玩QT:Qt 使用 QAxObject 类读写 Excel 文档(内附源码)
    Qt使用QAxObject类读写Excel文档因为工作需要,最近研究了一下使用Qt的QAxObject类实现对Excel文档的简单读写,查阅了很多资料 ... [详细]
  • javaftp上传,javaftp下载文件
    本文目录一览:1、javaftp上传5G以上大文件,怎么做 ... [详细]
  • splitjava的简单介绍
    本文目录一览:1、Javasplit方法2、 ... [详细]
author-avatar
王慧1019
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有