问题:1:android提供的textview显示文本时上下默认有一定间距
2:在显示中文时,如果textview长度不够,会自动换行后上一行会最后会剩余很多空间
效果:
核心代码:
重写onMeasure方法
/** * 如果这个自定义view支持wrap_content,则必须重写这个方法来处理wrap_content情况 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //获取父控件期望view宽度,如果是match_parent,则这个宽度便是父控件的宽度 int _specMode = MeasureSpec.getMode(widthMeasureSpec); int _specSize = MeasureSpec.getSize(widthMeasureSpec); //必须在这个方法中调用初始化画笔和计算字符宽度代码 //因为当在代码中调用setmText()时,在这里才能捕捉到设置进来的文本内容并重新测量 init(); //view的宽度等于父控件的宽度减去左右的间距 mLine =(int)Math.ceil(mWidth/(_specSize-mLeftPadding-mRightPadding)); //view的高度 = 行数乘上字符的高度 mViewHeight = (int)(mLine*mHeight); //设置view的高度 //如果是exactly模式,则传进来的宽度就是组件的宽度,一般是准确值或者match_parent if (_specMode == MeasureSpec.EXACTLY) { mViewWidth = _specSize; } else { //取最小值,因为预定的result可能大于父控件大小 //主要应对宽度为warp_content时, if(_specMode == MeasureSpec.AT_MOST){ mViewWidth = Math.min(600,_specSize); } } //view的宽度 = 父控件的宽度减去两端的宽度 mViewWidth = mViewWidth - mLeftPadding - mRightPadding; setMeasuredDimension(mViewWidth,mViewHeight); mStrArrary = new String[mLine]; int j = 0; int start = 0; //将文本分割成数组 for(int i = 1;i <= mText.length();i++){ if (mPaint.measureText(mText.substring(start,i))>=mViewWidth){ mStrArrary[j] = mText.substring(start,i-1); j++; start = i-1; } } mStrArrary[mLine-1] = mText.substring(start,mText.length()); }
private void init() { mPaint = new Paint(); mPaint.setColor(mTextColor); //先设置字体大小 mPaint.setTextSize(mTextSize); //后测量文字宽度 mWidth = mPaint.measureText(mText); //再测量文字的高度 Paint.FontMetrics fm = mPaint.getFontMetrics(); mHeight = fm.bottom-fm.top; leading = fm.leading; }demo地址: demo地址