flutter实现根据widget大小自动调整文字size以最大尺寸显示

首先使用了flutter pub中的auto_size_text,不管设置max_font_size、min_font_size还是style,依然不符合想要的显示效果,所以自己实现了一下

先上实现效果
初始的widget大小
尺寸大小固定
此时更改文字内容不改变widget尺寸
文字内容增加自动根据当前尺寸大小以适应
文字大小不变,widget尺寸增大
当widget尺寸增大时自动增大文字size
尺寸变小
文字不变尺寸变小
实现逻辑:

  1. 首先测量当前显示text的尺寸大小,因为使用的自适应尺寸,所以实际测量的是父组件的大小,然后减去父组件中其他组件的大小得到当前text widget的最大尺寸
  2. 根据最大尺寸换算出最大的font size
  3. 根据文字内容和font size测量出对应的宽高
  4. 当宽度大于widget的最大宽度时(因为实际上有内边距,所以需要多减去一点)font size减小
  5. 继续测量text宽高当高度大于最大高度时(同有内边距)行数增加
  6. 行数增加后对应的test宽度应该减去一行
  7. 4、5、6循环直到不满足条件此时font size是满足widget尺寸的最大值(记得边缘检测)

代码由于没有整理就不贴了
等有空时上传pub
(大概率忘记或者没空或者懒得做)

更新: 仔细看了下发现auto_size_text使用上述步骤限制好尺寸后可以实现部分效果,即尺寸不变的情况下文字变小,但尺寸变化后无法重新适应

如果仅需要尺寸不变时自适应的文字大小使用auto_size_text即可

### Flutter 布局和绘图中的常用单位 在 Flutter 的布局和绘图过程中,开发者可以使用多种单位来指定尺寸、间距和其他几何属性。这些单位有助于创建响应式的用户界面。 #### 逻辑像素(Logical Pixels) Flutter 使用逻辑像素作为默认的测量单位。这允许应用适应不同设备屏幕密度的变化。例如,在高分辨率屏幕上显示相同的视觉大小[^1]。 ```dart Container( width: 100, // 默认情况下宽度为100逻辑像素 height: 100, color: Colors.blue, ) ``` #### 物理像素(Physical Pixels) 物理像素是指显示器上的实际硬件像素点数。通常不建议直接使用此单位进行 UI 开发,因为不同设备具有不同的 DPI 设置。可以通过 `MediaQueryData.devicePixelRatio` 获取当前设备的比例因子并转换成逻辑像素[^2]。 #### 文本相对单位(Text Relative Units) 为了使文本更易于阅读以及更好地适配各种字体大小设置,Flutter 提供了一些基于文本特性的长度度量方式: - **em**: 相对于父级元素字体大小的一个倍数值。 - **rem**: 根据根节点 (`<html>`) 字体大小计算得出的距离值。 不过需要注意的是,由于 Dart 并未原生支持 CSS 类似的 em 或 rem 单位,因此这类概念更多体现在第三方库或是自定义实现上[^3]。 #### 屏幕百分比(Screen Percentage) 有时希望某些控件能够占据整个视窗的一部分空间,则可通过比例的方式来表达这种需求。比如全屏背景图片就可以通过设定宽高等于窗口尺寸达到理想的效果。 ```dart import 'package:flutter/material.dart'; class FullScreenImage extends StatelessWidget { @override Widget build(BuildContext context) { final Size size = MediaQuery.of(context).size; return Container( width: size.width * 1.0, // 宽度等于屏幕宽度 height: size.height * 1.0, // 高度等于屏幕高度 decoration: BoxDecoration( image: DecorationImage( fit: BoxFit.cover, image: NetworkImage('https://example.com/image.jpg'), ), ), ); } } ``` #### 自动调整大小文字(Auto-sizing Text) 当涉及到多平台兼容性和国际化时,自动缩放文字功能变得尤为重要。借助 `AutoSizeText` 插件可以让文本根据可用空间动态改变字号以确保最佳展示效果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值