Android根据可显示宽度调整字体大小


 

1、实现结果:

定义一个字体最大值和字体最小值

默认情况下显示最大值,当内容排版空间不足的情况下,调整字体大小

 

2、分析过程:

         可以通过计算指定字体大小的文字计算宽度是否能够排下内容,不能,就减小字体大小

 

3、attrs添加参数:

 <attr name="maxTextSize" format="dimension"/>
    <attr name="minTextSize" format="dimension"/>
    <declare-styleable name="AutoAlignTextView">
        <attr name="maxTextSize" />
        <attr name="minTextSize"/>
    </declare-styleable>


         设置一个maxTextSize和minTextSize,maxTextSize代表最大显示文字大小,minTextSize设置最小显示文字大小

4、自定义TextView

/**
 * 自定义TextView,根据宽度改变大小
 */
public class AutoAlignTextView extends TextView {

    private float maxTextSize, minTextSize;   //最大字体和最小字体
    private float maxWidth;

    public AutoAlignTextView(Context context) {
        this(context, null);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        maxWidth = w;
    }

    public AutoAlignTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public AutoAlignTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs);
    }

    public void init(Context context, AttributeSet attrs) {
        setMaxLines(1);
        TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.AutoAlignTextView);
        float percentWidth1px = AutoUtils.getPercentWidth1px();
        maxTextSize = mTypedArray.getDimension(R.styleable.AutoAlignTextView_maxTextSize, 48) * percentWidth1px;
        minTextSize = mTypedArray.getDimension(R.styleable.AutoAlignTextView_minTextSize, 24) * percentWidth1px;
    }

    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        adjustTvTextSize();
    }

    //动态修改字体大小
    private void adjustTvTextSize() {
        String text = getText().toString();
        int avaiWidth = (int) (maxWidth - getPaddingLeft() - getPaddingRight() - DisplayUtils.dip2px(getContext(), 2));
        if (avaiWidth <= 0) {
            return;
        }
        TextPaint textPaintClone = new TextPaint(getPaint());
        float trySize = maxTextSize;
        textPaintClone.setTextSize(trySize);
        while (textPaintClone.measureText(text) > avaiWidth && trySize > minTextSize) {
            trySize--;
            textPaintClone.setTextSize(trySize);
        }
        setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize);
    }

    public AutoAlignTextView setMaxTextSize(float maxTextSize) {
        this.maxTextSize = maxTextSize;
        return this;
    }

    public AutoAlignTextView setMinTextSize(float minTextSize) {
        this.minTextSize = minTextSize;
        return this;
    }

    public void refresh() {
        adjustTvTextSize();
    }
}


自定义一个textView,如下

init(Context context, AttributeSet attrs)方法接收maxTextSize和minTextSize,percentWidth1px为屏幕密度,在这里自己可以调整,通过dp方式来接收转换,因为我这里使用autolayout框架,percentWidth1px为横屏1080分辨率时,1px代表的大小,比如在720p的时候,percentWidth1px就是1.5

 

adjustTvTextSize()方法为动态修改文字的方法,通过计算可显示宽度来调整字体大小

        

5、使用

在布局头部添加xmlns:app=http://schemas.android.com/apk/res-auto ,然后传入最大值和最小值

<com.yisanban.app.widget.AutoAlignTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="50px"
    android:background="@color/white"
    android:paddingLeft="30px"
    android:paddingRight="90px"
    android:paddingTop="180px"
    android:textColor="@color/black1"
    app:maxTextSize="@dimen/very_font_size"
    app:minTextSize="@dimen/large_font_size" />

最终会字体大小会随着文字数量的增加和减小,以保证文字可以全部显示


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值