먼저 텍스트 크기를 결정해야합니다. 각 문자의 폭은 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);
}
}
예제를 보여 주시겠습니까? –
난 어떤 view.I 사용하고 싶지 않아 그냥 이미지 위에 텍스트를 그릴 싶어요. drawText (..)와 같은 메서드가 있습니까? –
그런 방법은 없습니다. 새 캔버스 (비트 맵 비트 맵)를 사용하여 캔버스를 만들고 비트 맵에 텍스트를 그립니다. – faylon