今天在日常配置界面的时候,遇到了一个问题
先上设计图
本来看起来很简单的一个视觉图,但是在配置的时候,确遇到了问题
因为字体使用的是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,其他什么都不用管,就行了.我们再看看改完的效果
这样的话就大功告成了!