【Android自定义控件】Android实现自适应字体大小的竖向文字

前言


项目中展示病人住院的注意事项,条目的高度固定,显示文字大小需要根据字数数量进行自适应变化,文字要竖向显示。


实现


1、效果图

请添加图片描述


2、自定义控件绘制解析

此自定义控件的实现比较简单,最主要的两个功能。

1、计算文字大小

获取父布局的高度,除以文字的总长度,即可获取文字的大小。

2、使用Canvas竖向绘制每个字符

使用 canvas.drawText循环绘制字符,满足竖直显示效果


3、实现


public class AutoSizeVerticalTextView extends View {

    private final Paint mPaint = new Paint();

    private int mViewHeight;

    private int mViewWidth;

    private String mText;

    private final Context mContext;

    public AutoSizeVerticalTextView(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public AutoSizeVerticalTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    /**
     * 初始化画笔
     */
    private void init() {
        mPaint.setAntiAlias(true);
        mPaint.setColor(0xFFFFFFFF);
        mPaint.setTextAlign(Paint.Align.CENTER);
    }

    /**
     * 设置文字和大小
     */
    public void setData(String text, int fontSize) {
        this.mText = text;
        mPaint.setTextSize(fontSize);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // 设定宽度为固定值,测量高度
        mViewWidth = MeasureSpec.getSize(widthMeasureSpec);
        mViewHeight = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(mViewWidth, mViewHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        float textSize = calculateTextSize();
        mPaint.setTextSize(textSize);

        float startX = PUtil.dip2px(mContext,mViewWidth) / 2.0f;

        // 计算字符串的总高度
        float txtHeight = mPaint.getTextSize();

        // 绘制每个字符
        for (int i = 0; i < mText.length(); i++) {
            float startY = txtHeight * (i + 1);
            canvas.drawText(String.valueOf(mText.charAt(i)), startX, startY, mPaint);
        }
    }


    /**
     * 计算字体大小
     */
    private float calculateTextSize() {
        float desiredHeight = PUtil.dip2px(mContext,mViewHeight) / (float) mText.length();
        return desiredHeight > 0 ? desiredHeight * 0.95f : 12;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值