2012-11-27 61 views
3

有沒有在指定的矩形中繪製文本的方法? 我使用如何在android中的指定矩形中繪製文本?

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

直接繪製在畫布(ImageView的),但是,這吸引了單一行的所有文本。我想用指定的(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

我不想使用任何views.I只是想在圖像上繪製文本。是否有像drawText(..)這樣的方法? –

+0

沒有這樣的方法。使用新的Canvas(位圖位圖)製作畫布,並在位圖中繪製文本。 – faylon