返回顶部
首页 > 资讯 > 精选 >Android中TextView自动适配文本大小的解决方案有哪些
  • 561
分享到

Android中TextView自动适配文本大小的解决方案有哪些

2023-07-02 08:07:24 561人浏览 薄情痞子
摘要

本篇内容介绍了“Android中TextView自动适配文本大小的解决方案有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Autos

本篇内容介绍了“Android中TextView自动适配文本大小的解决方案有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    一、Autosizing的方式(固定宽度)

    官方推出的TextView的Autosizing方式,在宽度固定的情况下,可以设置最大文本Size和最小文本Size和每次缩放粒度,非常方便的就能实现该功能。

     <TextView        android:layout_width="340dp"        android:layout_height="50dp"        android:background="@drawable/shape_bg_008577"        android:gravity="center_vertical"        android:maxLines="1"        android:text="这是标题,该标题的名字比较长,产品要求不换行全部显示出来"        android:textSize="18sp"        android:autoSizeTextType="unifORM"        android:autoSizeMaxTextSize="18sp"        android:autoSizeMinTextSize="10sp"        android:autoSizeStepGranularity="1sp"/>
    • autoSizeTextType:设置 TextView 是否支持自动改变文本大小,none 表示不支持,uniform 表示支持。

    • autoSizeMinTextSize:最小文字大小,例如设置为10sp,表示文字最多只能缩小到10sp。

    • autoSizeMaxTextSize:最大文字大小,例如设置为18sp,表示文字最多只能放大到18sp。

    • autoSizeStepGranularity:缩放粒度,即每次文字大小变化的数值,例如设置为1sp,表示每次缩小或放大的值为1sp。

    效果:

    Android中TextView自动适配文本大小的解决方案有哪些

    如果在Java代码中使用,我们也可以这么用

    TextView tvText = findViewById(R.id.tv_text);TextViewCompat.setAutoSizeTextTypeWithDefaults(tvText,TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(tvText,10,18,1, TypedValue.COMPLEX_UNIT_SP);

    二、自定义View的方式(固定宽度)

    GitHub上有很多这种的TextView自定义,类似这样的。

    其核心思想和上面的 Autosizing 的方式类似,一般是测量 TextView 字体所占的宽度与 TextView 控件的宽度对比,动态改变 TextView 的字体大小。

    它们的类似用法如下:

        <ru.igla.widget.AutoSizeTextView        android:id="@+id/tvFullscreen"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="Long ancestry"        android:textColor="@android:color/black"        android:background="@android:color/white"        android:textSize="500sp"        android:maxLines="500"        android:gravity="center"        android:ellipsize="@null"        android:autoText="false"        android:autoLink="none"        android:linksClickable="false"        android:singleLine="false"        android:padding="0px"        android:includeFontPadding="false"        android:textAlignment="center"        android:typeface="normal"        android:layout_gravity="center"        android:textStyle="normal"        app:minTxtSize="8sp"        />

    效果和方案一类似

    三、使用工具类自行计算(非控件固定宽度)

    把第二步中自定义View计算宽度的方法抽取出来,我们可以可以得到一个工具类如下:

    private void adjustTvTextSize(TextView tv, int maxWidth, String text) {        int avaiWidth = maxWidth - tv.getPaddingLeft() - tv.getPaddingRight();        if (avaiWidth <= 0) {            return;        }        TextPaint textPaintClone = new TextPaint(tv.getPaint());             float trySize = textPaintClone.getTextSize();        while (textPaintClone.measureText(text) > avaiWidth) {            trySize--;            textPaintClone.setTextSize(trySize);        }        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize);    }

    Demo如下:

    Android中TextView自动适配文本大小的解决方案有哪些

    右侧的LinearLayout中需要包含2个文本 一个14sp 一个是30sp,同时居中但是要金额的文本自动适配大小。

                <LinearLayout                        android:layout_width="match_parent"                android:layout_height="wrap_content"                android:layout_marginLeft="@dimen/d_15dp"                android:layout_marginRight="@dimen/d_15dp"                android:gravity="center"                android:orientation="horizontal">                <TextView                    android:id="@+id/tv_job_detail_dollar"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="$"                    android:textColor="@color/black"                    android:textSize="@dimen/job_detail_message_size"/>                <TextView                    android:id="@+id/text_view_hourly_rate"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_marginLeft="@dimen/d_2dp"                    android:singleLine="true"                    android:text="-"                    android:textColor="@color/job_detail_black"                    android:textSize="30sp" />            </LinearLayout>

    可以看到2个都是wrap content,那么如何实现这种适应宽度+多布局的变长宽度效果呢。其实就是需要我们调用方法手动的计算金额TextView的宽度

        int mFullNameTVMaxWidth = CommUtils.dip2px(60);    //    mTextViewHourlyRate.setText(totalMoney);    //     while (true) {    //         float measureTextWidth = mTextViewHourlyRate.getPaint().measureText(totalMoney);    //         if (measureTextWidth > mFullNameTVMaxWidth) {    //             int textSize = (int) mTextViewHourlyRate.getTextSize();    //             textSize = textSize - 2;    //             mTextViewHourlyRate.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);    //         } else {    //             break;    //         }    //     }    adjustTvTextSize(mTextViewHourlyRate,mFullNameTVMaxWidth,totalMoney)

    效果如下:(该效果是去除边距之后的对齐效果)

    Android中TextView自动适配文本大小的解决方案有哪些

    Android中TextView自动适配文本大小的解决方案有哪些

    四、去除TextView的边距

    我们都知道TextView绘制的时候并非是我们平常自定义View那种drawText,而是分为几块区域,基于基线绘制文本,并加入了上下左右的间距。

    Android中TextView自动适配文本大小的解决方案有哪些

    而不同的TestSize 它的间距还不同,比如上文中我们一个很小的 TextView 和一个很大的 TextView 在一起排列的时候,特别是大的 TextView 还是 AutoSize 的情况下,实现一些对齐效果就很难实现,我们就需要考虑到去除间距,只保留上图灰色的矩形框来绘制文本。

    代码如下:

    public class NoPaddingTextView extends AppCompatTextView {    private Paint mPaint = getPaint();    private Rect mBounds = new Rect();    private Boolean mRemoveFontPadding = false;//是否去除字体内边距,true:去除 false:不去除    public NoPaddingTextView(Context context) {        super(context);    }    public NoPaddingTextView(Context context, AttributeSet attrs) {        super(context, attrs);        initAttributes(context, attrs);    }    public NoPaddingTextView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initAttributes(context, attrs);    }    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        if (mRemoveFontPadding) {            calculateTextParams();            setMeasuredDimension(mBounds.right - mBounds.left, -mBounds.top + mBounds.bottom);        }    }    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);    }    protected void onDraw(canvas canvas) {        drawText(canvas);    }        private void initAttributes(Context context, AttributeSet attrs) {        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.NoPaddingTextView);        mRemoveFontPadding = typedArray.getBoolean(R.styleable.NoPaddingTextView_removeDefaultPadding, false);        typedArray.recycle();    }        private String calculateTextParams() {        String text = getText().toString();        int textLength = text.length();        mPaint.getTextBounds(text, 0, textLength, mBounds);        if (textLength == 0) {            mBounds.right = mBounds.left;        }        return text;    }        private void drawText(Canvas canvas) {        String text = calculateTextParams();        int left = mBounds.left;        int bottom = mBounds.bottom;        mBounds.offset(-mBounds.left, -mBounds.top);        mPaint.setAntiAlias(true);        mPaint.setColor(getCurrentTextColor());        canvas.drawText(text, (float) (-left), (float) (mBounds.bottom - bottom), mPaint);    }}

    使用:

                <LinearLayout                           android:layout_width="match_parent"                android:layout_height="wrap_content"                android:layout_marginLeft="@dimen/d_15dp"                android:layout_marginRight="@dimen/d_15dp"                android:gravity="center"                android:orientation="horizontal">                <com.guadou.componentservice.widget.view.NoPaddingTextView                    android:id="@+id/tv_job_detail_dollar"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="$"                    android:textColor="@color/black"                    android:background="@color/yellow"                    android:textSize="@dimen/job_detail_message_size"                    app:removeDefaultPadding="true" />                <com.guadou.componentservice.widget.view.NoPaddingTextView                    android:id="@+id/text_view_hourly_rate"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_marginLeft="@dimen/d_2dp"                    android:singleLine="true"                    android:text="-"                    android:background="@color/red"                    android:textColor="@color/job_detail_black"                    android:textSize="30sp"                    app:removeDefaultPadding="true" />            </LinearLayout>

    效果如下:

    Android中TextView自动适配文本大小的解决方案有哪些

    “Android中TextView自动适配文本大小的解决方案有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Android中TextView自动适配文本大小的解决方案有哪些

    本文链接: https://lsjlt.com/news/340559.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Android中TextView自动适配文本大小的解决方案有哪些
      本篇内容介绍了“Android中TextView自动适配文本大小的解决方案有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Autos...
      99+
      2023-07-02
    • Android中TextView自动适配文本大小的几种解决方案
      目录TextView文本大小自动适配与TextView边距的去除一、Autosizing的方式(固定宽度)二、自定义View的方式(固定宽度)三、使用工具类自行计算(非控件固定...
      99+
      2022-06-09
      解决方案 Android
    • Android编程实现自动调整TextView字体大小以适应文字长度的方法
      本文实例讲述了Android编程实现自动调整TextView字体大小以适应文字长度的方法。分享给大家供大家参考,具体如下: package com.test.android....
      99+
      2022-06-06
      自动 方法 长度 Android
    • mysql恢复过大文件自动断开的解决方案
      最近使用备份文件进行mysqdump恢复,由于数据过大,2小时候会自动断开,因此尝试以下设置即可解决问题set global max_allowed_packet=100 00...
      99+
      2024-04-02
    • Alma Linux中的存储解决方案和配置方法有哪些
      Alma Linux中可以使用多种存储解决方案和配置方法,以下是其中一些常见的: LVM(Logical Volume Manag...
      99+
      2024-04-24
      Alma Linux
    • 在C++中获取文件大小的方式有哪些
      这篇文章给大家介绍在C++中获取文件大小的方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++获取文件大小代码示例:#include < iostream> #inc...
      99+
      2023-06-06
    • DKH企业级大数据解决方案的优势有哪些
      DKH企业级大数据解决方案的优势有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。DKH企业级大数据解决方案的优势介绍大数据技术的发展与应用已经在深刻地改变和影响我们的日常生...
      99+
      2023-06-02
    • HTML5中移动页面自适应手机屏幕的方法有哪些
      这篇文章主要介绍了HTML5中移动页面自适应手机屏幕的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、使用meta标签:view...
      99+
      2024-04-02
    • 运维中的高可用MySQL解决方案有哪些
      运维中的高可用MySQL解决方案有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。数据库作为最基础的数据存储服务之一,在存储系统中有着非常重...
      99+
      2024-04-02
    • Android项目中解析XML文件的方法有哪些
      今天就跟大家聊聊有关Android项目中解析XML文件的方法有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。xml文件代码<&#63;xml version=&qu...
      99+
      2023-05-31
      android xml roi
    • LeetCode索引中的重定向问题有哪些解决方案?
      LeetCode是一个著名的面向程序员的在线编程网站,提供了丰富的算法题目,对于想要提升自己的算法和编程能力的程序员来说是非常有用的。然而,在使用LeetCode的时候,你可能会遇到重定向的问题,这些问题可能会影响你的学习和使用体验。本文...
      99+
      2023-09-23
      重定向 leetcode 索引
    • 选择微软大数据解决方案处理网站大数据的优势有哪些
      这篇文章主要介绍“选择微软大数据解决方案处理网站大数据的优势有哪些”,在日常操作中,相信很多人在选择微软大数据解决方案处理网站大数据的优势有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”选择微软大数据解决...
      99+
      2023-06-10
    • Python中为我们提供解决方案的方法特性有哪些
      Python中为我们提供解决方案的方法特性有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实际上,在日常的工作中,我们很多需求,无论是常见...
      99+
      2024-04-02
    • Python API 中自然语言处理对象的常见问题及解决方案有哪些?
      自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支,它涉及到计算机对自然语言的理解和生成。Python 是一个流行的编程语言,也是自然语言处理领域的首选语言之一。Python 中有许...
      99+
      2023-09-09
      api 自然语言处理 对象
    • 解决VSCode中文设置不生效的方法有哪些?
      解决VSCode中文设置不生效的方法有哪些? Visual Studio Code(简称VSCode)是一款广受欢迎的轻量级的代码编辑器,由于其高度的自定义性和丰富的插件生态,被越来越...
      99+
      2024-04-02
    • pandas中groupby分组对象的组内排序解决方案有哪些
      这篇文章给大家分享的是有关pandas中groupby分组对象的组内排序解决方案有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题:根据数据某列进行分组,选择其中另一列大小top-K的的所在行数据解析:求解...
      99+
      2023-06-14
    • Django 开发技术中的存储问题:Python 有哪些解决方案?
      Django 是一个流行的 Python web 框架,它提供了很多便捷的方式来处理数据存储。在 Django 开发中,存储问题是一个非常重要的话题。Python 有很多解决方案来解决这个问题,本文将介绍其中几种。 关系型数据库 Dja...
      99+
      2023-06-19
      django 开发技术 存储
    • Java编程中常用的分布式缓存解决方案有哪些?
      Java编程中常用的分布式缓存解决方案有哪些? 随着互联网的发展,越来越多的应用程序需要处理大量数据,而且这些数据需要在多个节点之间共享。因此,分布式缓存成为了一个非常重要的话题。在Java编程中,有很多种分布式缓存解决方案,本文将会介绍其...
      99+
      2023-10-05
      缓存 分布式 编程算法
    • java中获取配置文件路径中含有中文,出现乱码的情况解决方案
      问题背景:读取配置文件,但是读到的目录信息是中文乱码的。 第一步: 参考代码如上截图,方法即:读取jdbc配置,获取了配置文件(jdbc.properties)地址,然后加载这个文件读取配置信息,但是获取的文件目录的地址中文转译了。 第...
      99+
      2023-09-04
      java 开发语言
    • python pycharm中使用opencv时没有代码自动补全提示的解决方案
      目录解决方案有2种方法1方法2注意事项总结python pycharm中使用opencv时,没有代码自动补全提示 解决方案有2种 今天工作时突然发现,在写OPENCV相关代码时,没有...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作