Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中以指定的矩形绘制文本?_Android_Android Canvas_Drawtext - Fatal编程技术网

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

如何在android中以指定的矩形绘制文本?,android,android-canvas,drawtext,Android,Android Canvas,Drawtext,是否有一种方法可以在指定的矩形中绘制文本? 我正在使用直接绘制画布(ImageView) 但这把整个文本都画在了一行中。我想在指定的(x,y)、(x1,y1)限制内用换行符包装文本。我不想使用文本视图或任何其他视图 我只想把文字画在图像上 有什么方法可以做到这一点吗 提前感谢首先您必须确定文本大小。每个字符的宽度可以通过getTextWidths()获得,高度与文本大小相同。尝试估计初始文本大小,并使用文本的高度和宽度调整最终值 其次,你需要打破界限。Paint.getTextWidths()或

是否有一种方法可以在指定的矩形中绘制文本? 我正在使用直接绘制画布(ImageView)

但这把整个文本都画在了一行中。我想在指定的(x,y)、(x1,y1)限制内用换行符包装文本。我不想使用文本视图或任何其他视图

我只想把文字画在图像上

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


提前感谢

首先您必须确定文本大小。每个字符的宽度可以通过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);
    }
}
公共静态类RectTextView扩展了视图{
私人int mWidth=200;
私有整数mHight=100;
private String mText=“你好,世界。难道你不知道为什么,为什么你和我?”;
私人油漆;
私有列表mTextBreakPoints;
公共RectTextView(上下文){
这个(上下文,空);
}
公共RectTextView(上下文、属性集属性){
超级(上下文,attrs);
mPaint=新油漆();
mPaint.setColor(Color.WHITE);
mPaint.setAntiAlias(true);
setSuitableTextSize();
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
设置测量尺寸(米宽,米高);
}
@凌驾
受保护的void onDraw(画布){
int start=0;
int x=0;
int y=0;
for(int点:mTextBreakPoints){
y+=mPaint.getTextSize();
drawText(多行文字、起点、点、x、y、mPaint);
起点=点;
}
}
私有void setSuitableTextSize(){
int textSize=getEstimateTextSize();
对于(;textSize>0;textSize--){
if(isTextSizeSuitable(textSize))
返回;
}
}
专用布尔值isTextSizeSuitable(整数大小){
mTextBreakPoints=newarraylist();
mPaint.setTextSize(大小);
int start=0;
int end=mText.length();
while(开始<结束){
int len=mpain.breakText(多行文字、开始、结束、true、mWidth、,
无效);
start+=len;
mTextBreakPoints.add(开始);
}
返回mTextBreakPoints.size()*size
我不想使用任何视图。我只想在图像上绘制文本。有没有像drawText(..)这样的方法?没有这样的方法。使用新画布(位图)制作画布,并在位图中绘制文本。
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);
    }
}