2013-08-26 68 views
12

Tôi hiện đang tạo trình chỉnh sửa hình ảnh và đang cố vẽ văn bản lên trên hình ảnh bằng canvas.drawText(). Cho đến nay tôi đã thành công trong việc làm điều này nhưng khi người dùng nhập văn bản quá dài, văn bản chỉ tiếp tục trên một dòng ra khỏi trang và không tự bọc mình với chiều rộng của màn hình. Tôi sẽ đi đâu để tới đó? Tôi đã cố gắng bằng cách sử dụng một bố trí tĩnh nhưng dường như không thể làm cho nó hoạt động, có ai có một hướng dẫn để làm điều này?Android drawText bao gồm gói văn bản

chức năng của tôi để vẽ trên vải sử dụng bố trí tĩnh:

public Bitmap createImage(float scr_x,float scr_y,String user_text){ 

      Canvas canvas = new Canvas(image); 

      scr_x = 100; 
      scr_y = 100; 
      final TextPaint tp = new TextPaint(Color.WHITE);  
      canvas.save(); 
      StaticLayout sl = new StaticLayout("" + user_text, tp, originalBitmap.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); 
      sl.draw(canvas); 

     return image; 
     } 

Được rồi, tôi đã cập nhật mã của tôi, nhưng khi tôi cố gắng để vẽ vào hình ảnh có gì xảy ra ở tất cả, tôi không có ý tưởng tại sao hoặc:

public Bitmap createImage(String user_text) { 
    // canvas object with bitmap image as constructor 
    Canvas canvas = new Canvas(image); 
    TextPaint tp = new TextPaint(); 
    tp.setColor(Color.RED); 
    tp.setTextSize(50); 
    tp.setTextAlign(Align.CENTER); 
    tp.setAntiAlias(true); 
    StaticLayout sl = new StaticLayout("" + user_text, tp, 
      canvas.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1, 0, false); 
    canvas.translate(100, 100); 
    sl.draw(canvas); 
    return image; 
} 

Có phải lớp tĩnh không được dùng để vẽ trên vải không?

+0

Hãy xem câu trả lời này khác cho một ví dụ sử dụng tốt của 'StaticLayout's: http: //stackoverflow.com/a/8369690/293280 –

+0

bản sao có thể có của [Vẽ văn bản nhiều dòng thành Canvas] (http://stackoverflow.com/questions/6756975/draw-multi-line-text-to-canvas) –

Trả lời

11

Có, StaticLayout những gì bạn định sử dụng để vẽ văn bản nhiều dòng trên Canvas. Tiết kiệm cho mình một thế giới của nỗi đau và không nghĩ về việc tự phá vỡ văn bản - bạn đang đi đúng hướng. Tôi không chắc chắn về vấn đề bitmap, nhưng mã thứ hai của bạn ở trên chỉ làm việc tốt để vẽ văn bản trên một khung vẽ cho tôi.

Đây là cách bạn vẽ một Layout trên Canvas: http://developer.android.com/reference/android/text/Layout.html#draw(android.graphics.Canvas)

+0

Vui lòng cung cấp mẫu, vì StaticLayout không có bất kỳ phương pháp vẽ trực tiếp nào cho Canvas (và Canvas không có bất kỳ hình vẽ nào) (text.layout)) –

+0

Câu trả lời của tôi là đúng, nhưng đó không phải là cách tốt nhất. làm thế nào không công bằng này là –

+0

Tôi có thể xác nhận giải pháp Marcos thực sự làm việc, tôi quên thêm dòng sau vào cuối, iv_ttx.setImageBitmap (hình ảnh) ..... Cảm ơn bạn Marco. –

-2

Bạn nên tự mình xử lý, tính toán kích thước văn bản và gói nội dung theo một cách nào đó (đường đứt ở chiều rộng tối đa hoặc quấn từ cuối cùng).

Tôi đã làm điều đó trên Java SE với FontMetrics, không bao giờ dành cho Android; nhưng bạn nên xem:

http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html 

Như được chỉ ra bởi Lisa, StaticLayout là cách để đo lường gói văn bản.

+0

Ý bạn là sao? Tôi thực sự đấu tranh với điều này vì tôi khá mới. Dường như đọc tất cả các chủ đề khác mà phương thức StaticLayout được ưa thích? –

+0

Các thành phần mở rộng Xem sẽ không vẽ bất kỳ thứ gì cho đến khi bố cục và đo được gọi, có thể bạn cần gọi sl.measure (100,100, chiều rộng, chiều cao) rồi vẽ. Nhưng tôi biết rằng đo chiều rộng ký tự để bọc nội dung có thể được thực hiện. –

+2

StaticLayout có ý nghĩa đặc biệt để hiển thị văn bản nhiều dòng, bao gồm xử lý ngắt dòng cho bạn. Bạn hoàn toàn nên sử dụng nó để vẽ văn bản trên Canvas trong bất kỳ trường hợp nào mà bạn "sẽ bị cám dỗ gọi Canvas.drawText() trực tiếp". Tin tôi đi, bạn KHÔNG muốn đột nhập vào dòng của riêng bạn. http://developer.android.com/reference/android/text/StaticLayout.html –

3
public Bitmap drawMultilineTextToBitmap(Context gContext, 
            int gResId, 
            String gText) { 

    // prepare canvas 
    Resources resources = gContext.getResources(); 
    float scale = resources.getDisplayMetrics().density; 
    Bitmap bitmap = BitmapFactory.decodeResource(resources, gResId); 

    android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig(); 
    // set default bitmap config if none 
    if(bitmapConfig == null) { 
    bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; 
    } 
    // resource bitmaps are imutable, 
    // so we need to convert it to mutable one 
    bitmap = bitmap.copy(bitmapConfig, true); 

    Canvas canvas = new Canvas(bitmap); 

    // new antialiased Paint 
    TextPaint paint=new TextPaint(Paint.ANTI_ALIAS_FLAG); 
    // text color - #3D3D3D 
    paint.setColor(Color.rgb(61, 61, 61)); 
    // text size in pixels 
    paint.setTextSize((int) (14 * scale)); 
    // text shadow 
    paint.setShadowLayer(1f, 0f, 1f, Color.WHITE); 

    // set text width to canvas width minus 16dp padding 
    int textWidth = canvas.getWidth() - (int) (16 * scale); 

    // init StaticLayout for text 
    StaticLayout textLayout = new StaticLayout(
    gText, paint, textWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); 

    // get height of multiline text 
    int textHeight = textLayout.getHeight(); 

    // get position of text's top left corner 
    float x = (bitmap.getWidth() - textWidth)/2; 
    float y = (bitmap.getHeight() - textHeight)/2; 

    // draw text to the Canvas center 
    canvas.save(); 
    canvas.translate(x, y); 
    textLayout.draw(canvas); 
    canvas.restore(); 

    return bitmap; 
} 

nguồn: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/