TextView 设置其他字体后,显示不全的问题

今天在日常配置界面的时候,遇到了一个问题

先上设计图

 

本来看起来很简单的一个视觉图,但是在配置的时候,确遇到了问题

因为字体使用的是DINCondensed-Bold这个样式,而字体又比较大(36sp),如果textview配置成wrap_content

那么设置在手机上的时候,右边的数字会溢出去.

那么有的朋友可能就会说了,你这个textview 设置成match_parent或者写死它的长度不就可以了么?或者给这个textview设置一个右padding。

因为我这个数字右边还有文字(“天”),所以无论写死长度或者配置match_parent,都会很难看,达不到设计要求,设置右pading就更不行了。

 

     那么该怎么解决呢?其实很简单,大家都想到了,自定义一个类,继承textview,然后重写onMeasure方法,就可以了,这里只需要注意的一点,就是在计算textSize的时候,要注意获取到的单位是px,而不是sp,获取字符串长度的时候,要注意把Typeface设置到Paint上去,就行了,好,废话不多说,直接上代码.

 

public class DinoldTextView extends android.support.v7.widget.AppCompatTextView {

    private Context context;

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

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

    public DinoldTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int wMode = MeasureSpec.getMode(widthMeasureSpec);
        int wSize = MeasureSpec.getSize(widthMeasureSpec);

        int hMode = MeasureSpec.getMode(heightMeasureSpec);
        int hSize = MeasureSpec.getSize(heightMeasureSpec);

        hSize =  this.getMeasuredHeight();
        TextPaint newPaint = new TextPaint();
        String textStr = getText().toString();
        float textSize = getResources().getDisplayMetrics().scaledDensity  * px2sp(context, getTextSize());
        newPaint.setTextSize(textSize);
        float textWidth = getLineLength(textStr, getTextSize());
        int targetWidith = 0;
        int newWidthMeasureSpec = 0;
        int newHeightMeasureSpec = 0;
        switch (wMode){
            case UNSPECIFIED:
                wSize = (int) (DpPxUtil.dip2px(context, context.getResources().getDimension(R.dimen.magin_or_padding_lv_00)) + textWidth);
                newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(wSize, wMode);
                break;

            case EXACTLY:
                newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(wSize, wMode);
                break;

            case AT_MOST:
                targetWidith = (int) (DpPxUtil.dip2px(context, context.getResources().getDimension(R.dimen.magin_or_padding_lv_00)) + textWidth);
                if(wSize > targetWidith){
                    wSize = targetWidith;
                }
                newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(wSize, wMode);
                break;
        }
        newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(hSize, hMode);
        setMeasuredDimension(newWidthMeasureSpec, newHeightMeasureSpec);
    }

    public int getLineLength(String str, float textSize) {
        Paint pFont = new Paint();
        Typeface fromAsset = Typeface.createFromAsset(context.getAssets(), "fonts/Bold.ttf");
        pFont.setTypeface(fromAsset);
        pFont.setTextSize(textSize);
        return (int) pFont.measureText(str);
   }
}

  这里我重新计算了字符串的长度,并且加上了一个默认值, R.dimen.magin_or_padding_lv_00 = 2dp;这样就相当于,在原有的基础上,把textview扩展了一点宽度,那么这个数字既不会再溢出了,配置的时候也很简单,只要把原有的textview,替换成这个

DinoldTextView,其他什么都不用管,就行了.我们再看看改完的效果

这样的话就大功告成了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值