`
xuanzhui
  • 浏览: 200991 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

动态更新字体大小以适应组件宽度

阅读更多

起始需求是TextView能够根据自身宽度自动调整字体大小,有以下链接可以参考

Auto Scale TextView Text to Fit within Bounds

Auto-fit TextView for Android

Using auto resize to fit EditText in Android (该文章列出了一些github的项目)

只是在我的项目中表现并不好。

 

于是考虑自己在代码中通过循环的方式,递减以达到字体大小自适应的效果。

该方法有几个要点:

1. dp <--> px,sp <--> px之间的转换

 

/**
 * 将px值转换为dp值
 */
public static float px2dp(final Context context, final float px) {
    return px / context.getResources().getDisplayMetrics().density;
}

/**
 * 将dp值转换为px值
 */
public static float dp2px(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}

/**
 * 将px值转换为sp值,保证文字大小不变
 */
public static int px2sp(Context context, float pxValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
}

/**
 * 将sp值转换为px值,保证文字大小不变
 */
public static int sp2px(Context context, float spValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (spValue * fontScale + 0.5f);
}

 

2. 获取控件自身的大小

通过getWidth(in px),或者如gridview,通过 (总宽度-margin-padding)/column 的方式获取,此处命名为itemWidth。

 

3. 字符串在view中占据空间的计算

参考 How to calculate string font width in pixels

Paint paint = new Paint();

//参数以px为单位
paint.setTextSize(sizeInPX);

//得到的结果也是以px为单位
float cursize = paint.measureText(textContent);

 

4. 循环寻找适配大小

Paint paint = new Paint();

int defaultFontSize = 16; //in sp

int finalTextSize = defaultFontSize;

String content="anything for test";

paint.setTextSize(sp2px(this, defaultFontSize));

float cursize = paint.measureText(content);

// finalTextSize > defaultFontSize/2 这样的限制按需修改
while (cursize > itemWidth && finalTextSize > defaultFontSize/2) {
    finalTextSize -= 1;

    Log.w(TAG, "has to change # " + content + " font size # " + finalTextSize);

    paint.setTextSize(sp2px(this, realTextSize));
    cursize = paint.measureText(content);
}

//现在最终的字体大小已经获取
//此处以textview为例
//需要注意textView setTextSize是以sp为单位的
textView.setTextSize(realTextSize);

//如果需要设置padding,那么相应的itemWidth也应该做调整
//textView.setPadding(horizontalMargin, 0, horizontalMargin, 0);

textView.setGravity(Gravity.CENTER);
...

 

 

 

 

0
3
分享到:
评论

相关推荐

    qt 自适应类,可以自适应调整控件字体大小,间距等

    qt 适应分辨率,自适应类,可以自适应调整控件字体大小,间距等。控件和窗口,针对分辨率和窗口变化,进行变化适应。是布局的不错的补充,利用好了,控件伸缩自如。

    TextView的字体自适应控件的大小

    5. **动态更新**:如果`TextView`的文本内容或者容器大小发生变化,需要重新执行以上步骤,以保持字体的自适应性。 在提供的压缩包文件名称“AutoAdjustSizeTextText”中,可能包含了一个实现此功能的自定义`...

    android字体自动适应

    3. **自适应字体大小**: 要实现字体自适应宽度,通常需要计算文本视图的宽度,并基于该宽度动态调整字体大小。这可以通过监听TextView的测量过程,然后根据宽度与期望的行数计算出合适的字体大小。 4. **...

    android TextView自适应字体大小

    这就是`AutoScale TextView`的概念,它是一种可以动态调整字体大小以适应文本内容和视图大小的技术。 在`Android`中实现`TextView`自适应字体大小主要涉及到以下几个关键知识点: 1. **TextWatcher**:这是一个...

    自动修改字体大小的TextView

    本文将深入探讨如何实现一个自动调整字体大小的`TextView`,以确保文字始终适应视图的宽度。 首先,我们了解问题的核心:当文本的总宽度大于`TextView`的宽度时,需要动态地减小字体大小;反之,如果文本宽度小于`...

    Delphi通过RTTI实现TdxDBGrid,TDBGrid标题,列宽,显示顺序,字体大小颜色等动态配置

    本文将深入探讨如何利用RTTI来实现TdxDBGrid和TDBGrid组件的动态配置,包括标题、列宽、显示顺序以及字体大小和颜色的设置。 首先,了解RTTI的基本概念。RTTI提供了关于类属性、方法和事件的元数据,这使得在运行时...

    TextView自适应字体大小缩放

    在某些场景下,我们希望`TextView`能够根据文本内容的多少自动调整字体大小,以便文本能完全适应控件的宽度,避免换行或者超出视图范围。这种功能称为“字体自适应大小缩放”,它可以通过多种方法实现,以确保文字...

    微信小程序文字跑马灯完美效果,精确计算文字宽度WXMarquee-master.zip

    为了精确计算文字宽度,开发者可能会编写一个函数,根据文字内容和字体大小计算理论宽度。考虑到不同设备的屏幕宽度和字体渲染差异,实际宽度可能与理论宽度有出入,所以需要在运行时动态获取元素的实际宽度,确保...

    嵌入到HTML的iframe自动适应大小

    在探讨“嵌入到HTML的iframe自动适应大小”的主题时,我们主要关注的是如何使一个内嵌在HTML页面中的iframe元素能够根据其内容或者父容器的尺寸动态调整自身的高度,从而实现良好的响应式设计和用户体验。...

    label或者输入框textfField输入的字符串的大小宽度

    6. **自适应布局**:在Auto Layout环境下,`UILabel`和`UITextField`可以根据约束自动调整大小,以适应内容的变化。通过设置合适的约束,可以确保控件的大小始终能容纳文本内容。 7. **计算字符串宽度**:在编程中...

    Android编程实现自动调整TextView字体大小以适应文字长度的方法

    本实例将详细讲解如何通过编程方式实现这一功能,主要涉及到自定义View、测量文字宽度以及动态调整字体大小等技术。 首先,我们创建一个名为`CustomTextView`的自定义TextView类,继承自`android.widget.TextView`...

    AutoScaleTextView自动改变文字大小TextView

    6. 如果文本内容动态更新,例如通过`setText()`方法,确保在设置新文本后也调用缩放算法来更新字体大小。 `AutoScaleTextViewDemo`可能是包含一个使用`AutoScaleTextView`示例的项目。这个项目可能包括以下组件: ...

    修改datePick和timepicker大小

    例如,可以修改字体大小、颜色、边距等属性。 3. **使用第三方库**:如`androidx.appcompat.widget.AppCompatDatePicker`和`androidx.appcompat.widget.AppCompatTimePicker`,它们提供了更好的兼容性和自定义性。...

    QPainter绘制显示框,字体可随窗口自动适应

    另外,如果你的程序包含多个需要自适应字体大小的组件,可以创建一个全局的字体策略,或者使用样式表(Qt StyleSheet)来统一设置字体,这样可以避免重复代码并保持代码的整洁性。 总之,通过合理使用`QPainter`、`...

    Uniapp match-media 检测节点 适配大屏小屏 不同屏幕视图组件

    在这个场景下,`match-media` 成为了一种强大的工具,用于检测设备的媒体特性,实现动态的布局调整,以适应不同大小的屏幕。 `match-media` API 是 Web 开发中的一个关键特性,它允许我们根据设备的特定条件(如...

    react-reactinputautosizeReact的自动调整大小输入框

    `react-input-autosize`就是这样一个库,它专为React设计,能够自动调整输入框的宽度以适应用户输入的内容。这个库使得创建动态输入框变得更加简单,无需手动处理输入框尺寸变化的复杂逻辑。 `react-input-autosize...

    .net 窗体中的字体位置变化

    在设置字体大小时,需要同步更新控件的大小,以保持其与字体的比例关系。 3. ** DPI 设置**:不同的显示器或操作系统设置有不同的DPI(每英寸点数),高DPI设置可能会放大控件,改变字体和控件的位置。确保你的窗体...

    Android-MultiFontViewKotlin库可用于在XML中动态地为视图选择自定义字体

    除了基本的字体切换,`MultiFontTextView`还支持其他高级功能,比如动态改变字体、根据文本长度自动调整字体大小以适应宽度等。通过这些特性,开发者可以构建更丰富的文本展示效果,提升应用的视觉体验。 在实际...

    android仿iphone DatePicker(字体适配) 滑动时间对话框

    在Android开发中,为了提供与iOS相似的用户体验,开发者经常需要实现类似iPhone的...通过自定义布局、动态调整字体大小和宽度,以及添加各种交互细节,我们可以创建一个既美观又易用的Android时间选择对话框。

    自动根据文字大小适应

    这个控件的核心特性在于其智能的自适应能力,它能够根据文本内容的多少和界面容器的尺寸动态地调整字体大小,确保文字始终清晰可见,且不超出显示范围。 在iOS开发中,通常我们使用UILabel来展示单行或多行文本,但...

Global site tag (gtag.js) - Google Analytics