android - 如何在android中的指定矩形中绘制文本?

标签 android android-canvas drawtext

有没有在指定矩形内绘制文字的方法? 我正在使用

直接绘制到 Canvas (ImageView)
canvas.drawText(text,x,y,paint) 

但这将整个文本绘制在一行中。我想在指定的 (x,y) ,(x1,y1) 限制内包装文本。我不想使用 TextView 或任何其他 View 。

我只想在图像上绘制文本。

有什么方法可以做到这一点吗?

提前致谢

最佳答案

首先,您必须确定文本大小。每个字符的宽度可以通过 getTextWidths() 获取,高度与文本大小相同。尝试估计一个初始文本大小,并使用文本的高度和宽度来调整最终值。

其次,您需要换行。 Paint.getTextWidths() 或 Paint.breakText() 都可以实现这个目标。

编辑:添加代码示例。

public static class RectTextView extends View {
    private int mWidth = 200;
    private int mHeight = 100;
    private String mText = "Hello world. Don't you know why, why you and I.";
    private Paint mPaint;
    private List<Integer> mTextBreakPoints;

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

    public RectTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setColor(Color.WHITE);
        mPaint.setAntiAlias(true);
        setSuitableTextSize();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(mWidth, mHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int start = 0;
        int x = 0;
        int y = 0;
        for (int point : mTextBreakPoints) {
            y += mPaint.getTextSize();
            canvas.drawText(mText, start, point, x, y, mPaint);
            start = point;
        }
    }

    private void setSuitableTextSize() {
        int textSize = getEstimateTextSize();
        for (; textSize > 0; textSize--) {
            if (isTextSizeSuitable(textSize))
                return;
        }
    }

    private boolean isTextSizeSuitable(int size) {
        mTextBreakPoints = new ArrayList<Integer>();
        mPaint.setTextSize(size);
        int start = 0;
        int end = mText.length();
        while (start < end) {
            int len = mPaint.breakText(mText, start, end, true, mWidth,
                    null);
            start += len;
            mTextBreakPoints.add(start);
        }
        return mTextBreakPoints.size() * size < mHeight;
    }

    private int getEstimateTextSize() {
        return (int) Math.sqrt(mWidth * mHeight / mText.length() * 2);
    }
}

关于android - 如何在android中的指定矩形中绘制文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13578731/

相关文章:

java - 当我单击两个重叠的 ImageView 时,其中一个给了我反馈,另一个则没有

android - 访问内容 ://sms/sent in android 2. 2(froyo)

winapi - DrawText 错误地绘制 Segoe UI 字体文本

android - RxAndroidBle - 如何断开所有连接的设备?

java - 尝试获取在android中绘制的每个随机圆的x,y坐标

android - 如何在 Canvas 上绘制带有 alpha 渐变的圆?

Android Canvas.drawText

FFmpeg drawtext 过滤器 - 是否可以将变量与 x、y 坐标的实时数据一起使用?

java - 需要 Android 方向技巧