博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android TextView 高度问题
阅读量:7115 次
发布时间:2019-06-28

本文共 2713 字,大约阅读时间需要 9 分钟。

hot3.png

前言:

在我们做界面开发的时候,UI的标注图中经常是标注了文字的字号和文件的间距。而当我们使用多个TextView 实现后,却发现textView 之间的空白区域的高度,是远大于设计标注的。

前提: TextView height = warp_content。 设为单行。

原因: TextView 高度包含 1) IncludedFontPadding  2,Line height;

而LineHeight 也并不是文字字号高度,并且也大于字号高度。

TextView textView = (TextView) findViewById(R.id.sample_text);        textView.setBackgroundColor(Color.YELLOW);        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX , 60);

1,关于行高获取:

int ht = textView.getLineHeight();

这个高度的获取,并不需要对当前的Text 进行测量。 与当前的TextSize 正相关。

2,

textView.setIncludeFontPadding(false);

可以通过这个方法,禁掉首行文字和末行文字的font padding。

3, 关于文字绘制与行高

public class MText extends TextView{    public MText(Context context) {        super(context);    }    public MText(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);    }    public MText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    public void onDraw(Canvas canvas){        super.onDraw(canvas);// FontMetrics对象        Paint textPaint = getPaint();        Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();// 计算每一个坐标        float baseX = 0;        float baseY = getBaseline();        float topY = baseY + fontMetrics.top;        float ascentY = baseY + fontMetrics.ascent;        float descentY = baseY + fontMetrics.descent;        float bottomY = baseY + fontMetrics.bottom;// BaseLine描画        Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);        baseLinePaint.setColor( Color.RED);        canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);// Base描画        canvas.drawCircle( baseX, baseY, 5, baseLinePaint);// TopLine描画        Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);        topLinePaint.setColor( Color.LTGRAY);        canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);// AscentLine描画        Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);        ascentLinePaint.setColor( Color.GREEN);        canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);// DescentLine描画        Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);        descentLinePaint.setColor( Color.YELLOW);        canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);// ButtomLine描画        Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);        bottomLinePaint.setColor( Color.MAGENTA);        canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);    }}

文字的行高计算:

float ascentY = baseY + fontMetrics.ascent;float descentY = baseY + fontMetrics.descent;

int lineHeght = descentY - ascentY; //[不是从源码得出的结论,待进一步验证]

 

 

参考:

https://blog.csdn.net/l732427480/article/details/51711970

转载于:https://my.oschina.net/u/592116/blog/1831531

你可能感兴趣的文章
CSS侧边栏宽度不动(更改页面宽度时),内容区宽度自适应
查看>>
lua -- debug
查看>>
传统媒体:广告都去哪儿了?
查看>>
Eclipse使用教程之精华篇
查看>>
排列生成算法注意事项
查看>>
Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
查看>>
那些最好的轮子 - PHP篇
查看>>
采用Unity快速开发高质量游戏的若干优化建议
查看>>
10 001st prime number
查看>>
C#-MessageBox全部函数重载形式及举例
查看>>
滑板控制器
查看>>
oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)
查看>>
hibernate建表 一对多 多的一方控制一的一方
查看>>
OpenCL 获取Program信息
查看>>
用jinja做了个E-Letter小项目
查看>>
Java与.NET DES加密解密互转
查看>>
wap网站获取访问者手机号PHP类文件
查看>>
js 正则之 检测素数
查看>>
第 3 章 单例模式【Singleton Pattern】
查看>>
[再寄小读者之数学篇](2014-07-16 两个条件给出二阶导中值)
查看>>