2022-03-02 Android APP 自动调整 TextView 文字大小仅显示一行

一、效果图如下,TextView 文字大小仅显示一行,超过后自动调整大小。

 二、源码

1、源码预览

 2、重载TextView类,SingleLineZoomTextView 文件

package com.giada.textviewautozoom;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;

public class SingleLineZoomTextView extends TextView {

    private Paint mPaint;
    private float mTextSize;

    public SingleLineZoomTextView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }
    public SingleLineZoomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }
    public SingleLineZoomTextView(Context context, AttributeSet attrs,
                                  int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
    }
    /**
     * getTextSize 返回值是以像素(px)为单位的,而 setTextSize() 默认是 sp 为单位
     * 因此我们要传入像素单位 setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
     */
    private void refitText(String text, int textWidth) {
        if (textWidth > 0) {
            mTextSize = this.getTextSize();//这个返回的单位为px
            mPaint = new Paint();
            mPaint.set(this.getPaint());
            int drawWid = 0;//drawableLeft,Right,Top,Buttom 所有图片的宽
            Drawable[] draws = getCompoundDrawables();
            for (int i = 0; i < draws.length; i++) {
                if(draws[i]!= null){
                    drawWid += draws[i].getBounds().width();
                }
            }
            //获得当前TextView的有效宽度
            int availableWidth = textWidth - this.getPaddingLeft()
                    - this.getPaddingRight()- getCompoundDrawablePadding()- drawWid;
            //所有字符所占像素宽度
            float textWidths = getTextLength(mTextSize, text);
            while(textWidths > availableWidth){
                mPaint.setTextSize(--mTextSize);//这里传入的单位是 px
                textWidths = getTextLength(mTextSize, text);
            }
            this.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);//这里设置单位为 px
        }
    }

    /**
     * @param textSize
     * @param text
     * @return 字符串所占像素宽度
     */
    private float getTextLength(float textSize,String text){
        mPaint.setTextSize(textSize);
        return mPaint.measureText(text);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        refitText(getText().toString(), this.getWidth());
    }

}

3、com\giada\textviewautozoom\MainActivity.java

package com.giada.textviewautozoom;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((SingleLineZoomTextView)findViewById(R.id.single_line_two)).setText("商鞅回顾自己这一生,施行变法,得到国君的信任,自己也飞黄腾达。");
    }
}

4、布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.giada.textviewautozoom.SingleLineZoomTextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:text="鬼灭之刃"
        android:textSize="20sp"
        android:gravity="center"
        />
    <TextView
        android:id="@+id/normal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:text="鬼灭之刃是日本漫画家吾峠呼世晴所著的少年漫画"
        android:textSize="20sp"
        android:gravity="center"
        />

    <com.giada.textviewautozoom.SingleLineZoomTextView
        android:id="@+id/single_line"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:text="鬼灭之刃是日本漫画家吾峠呼世晴所著的少年漫画"
        android:textSize="20sp"
        android:gravity="center"
        />

    <TextView
        android:id="@+id/another"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:text="秦国的商鞅带着家眷一行人等走在昏暗的小路上"
        android:textSize="20sp"
        android:gravity="center"
        />

    <com.giada.textviewautozoom.SingleLineZoomTextView
        android:id="@+id/single_line_two"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:text="商鞅虽然死了但是他国家强盛必先穷其民的治国理念却没有被废"
        android:textSize="20sp"
        android:gravity="center"
        />

</LinearLayout>

二、有价值的参考文章

1、Android 自动调整 TextView 文字大小仅显示一行 - 简书

2、​​​​​​android简单实现textview自动缩小文字_henkun的博客-CSDN博客_textview自动缩小 PS:这个方法文字多的时候会先显示两行的再缩小,效果不好。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值