2012-11-27 2 views
3

지정된 사각형에 텍스트를 그리는 방법이 있습니까? 나는어떻게 안드로이드에 지정된 rect에서 텍스트를 그릴 수 있습니까?

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

를 사용하여 캔버스 (이미지 뷰)에 직접 그리기 오전하지만이 한 줄의 전체 텍스트를 받았다. 지정된 (x, y), (x1, y1) 제한으로 텍스트를 래핑하려고합니다. 나는 textviews 또는 다른보기를 사용하고 싶지 않다.

그냥 이미지 위에 텍스트를 그려야합니다.

어떤 방법이 있습니까?

미리 감사드립니다.

답변

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); 
    } 
} 
+1

예제를 보여 주시겠습니까? –

+0

난 어떤 view.I 사용하고 싶지 않아 그냥 이미지 위에 텍스트를 그릴 싶어요. drawText (..)와 같은 메서드가 있습니까? –

+0

그런 방법은 없습니다. 새 캔버스 (비트 맵 비트 맵)를 사용하여 캔버스를 만들고 비트 맵에 텍스트를 그립니다. – faylon

관련 문제