3

指定した長方形にテキストを描く方法はありますか?を使用してキャンバス(ImageView)に直接描画しています

canvas.drawText(text,x,y,paint) 

しかし、これはテキスト全体を1行に描画しました。指定された(x、y)、(x1、y1)の制限でテキストを折り返したい。textviewsやその他のビューを使用したくありません。

画像の上にテキストを描きたいだけです。

これを行う方法はありますか?

前もって感謝します

4

1 に答える 1

4

まず、テキストサイズを決定する必要があります。各文字の幅は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);
    }
}
于 2012-11-27T06:59:49.610 に答える