自定义View实现正好显示文本

问题: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地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值