我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

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

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

    Android中TextView自动适配文本大小的几种解决方案

    目录TextView文本大小自动适配与TextView边距的去除一、Autosizing的方式(固定宽度)二、自定义View的方式(固定宽度)三、使用工具类自行计算(非控件固定宽度)四、去除TextView的边距总结TextView文本大小
    Android中TextView自动适配文本大小的几种解决方案
    2022-06-09

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录