Flutter¥和数字价格不能居底对齐。去掉Flutter文字空白区域

本文介绍如何在Flutter中解决UI价格展示底部不对齐的问题,通过计算文本的Capheight和底部距离,实现数字和符号的精确对齐。

最近有ui走查反馈价格¥和数字没有底部对,所以对flutter的文字绘制做了下了解,以此解决ui一直以来纠结的历史问题。
先看看正常情况和非正常情况的ui展示样式吧
在这里插入图片描述

可以看到数字,汉字和字母(不同的字母所占的高度还不一致) 24呵呵jki这文字
再给出字符的显示规则
在这里插入图片描述

针对价格(数字类型的展示) 其实获取的应该是Capheight,所以在Flutter中需要根据
TextPainter 来获取相关信息
Capheight = BaseLineHeight - o(字符空白区域到顶部距离),但Capheight距离顶部的距离无法获取,所以需要采取别的方式来。
贴出关键代码

TextPainter textPainter = TextPainter()
List<LineMetrics> list = textPainter.computeLineMetrics();
if (list?.isNotEmpty ?? false) {
   
   
// baseLine高度
toBaseLineHeight = list[0].ascent;
// 顶部空白距离
ascDistance = toBaseLineHeight - list[0].unscaledAscent;
} else {
   
   
  toBaseLineHeight = textPainter.computeDistanceToActualBaseline(TextBaseline.alphabetic);
  ascDistance = 0;
}
Size size = textPainter.size;
// 需要偏移的距离
bottomDistance = size.height - toBaseLineHeight;
// 存入次fontSize对应的数据 防止下次再计算提升性能
if (fontSizeInfo == null) {
   
   
  fontSizeMap[textStyle.fontSize] = FontSizeInfo(toBaseLineHeight, bottomDistance, ascDistance);
}
capheight = toBaseLineHeight - ascDistance - bottomDistance + 1 // 加1是防止小数,且1像素影响不大

稍后会合进develop分支
使用示例

Container(
  color: Colors.amber,
  margin: EdgeInsets.only(top: 6,bottom: 6),
  child: ExPrice('123456', TextStyle(fontSize: 50,height: 1.0),leftPriceUnit: '¥',leftPriceUnitStyle: TextStyle(fontSize: 12),),
),

完整代码如下

import 'dart:ui';

import 'package:flutter/material.dart';

/// 价格展示模块 修正控件底部有间距 导致不居中的问题 主要针对 ¥1234这种情况 不针对汉字 但如果需要可以借鉴此写法
class ExPrice extends StatelessWidget {
   
   
final String price; // 价格字符串
final TextStyle textStyle; // 价格Style
final String leftPriceUnit; 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值