2013-08-26 9 views
12

В настоящее время я создаю редактор изображений и пытаюсь нарисовать текст поверх изображения с помощью canvas.drawText(). До сих пор мне это удалось, но когда пользователь вводит слишком длинный текст, текст просто продолжается в одной строке на странице и не привязывается к ширине экрана. Как мне это сделать? Я пробовал использовать статический макет, но не могу заставить его работать, есть ли у кого-нибудь учебник для этого?Android drawText, включая перенос текста

Моя функция для рисования на холсте, используя статический макет:

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; 
     } 

Хорошо, я обновил свой код, но когда я пытаюсь рисовать на изображении ничего не происходит вообще, я понятия не имею, почему либо:

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; 
} 

Является ли staticlayout не предназначен для использования на холсте?

+0

Взгляните на этот другой ответ на хороший пример использования в 'StaticLayout's: HTTP: //stackoverflow.com/a/8369690/293280 –

+0

Возможный дубликат [Рисовать многострочный текст на холст] (http://stackoverflow.com/questions/6756975/draw-multi-line-text-to-canvas) –

ответ

11

Да, StaticLayout : Что вы собираетесь использовать для рисования многострочного текста на холсте. Спасите себя в мире боли и не думайте о том, чтобы сломать текст самостоятельно - вы на правильном пути. Я не уверен в проблеме битмапа, но ваш второй код выше работал отлично, чтобы нарисовать текст на холсте для меня.

Это, как вы рисуете макет на холсте: http://developer.android.com/reference/android/text/Layout.html#draw(android.graphics.Canvas)

+0

Пожалуйста, укажите образец, так как StaticLayout не имеет метода прямой рисования для Canvas (и Canvas не имеет ничьей (text.layout)) –

+0

Также мой ответ верный, но это не лучший способ ... просто вам увидеть как несправедливо это –

+0

Я могу подтвердить, что решение Маркоса действительно работает, я забыл добавить следующую строку в конце, iv_ttx.setImageBitmap (изображение) ..... Спасибо, Марко. –

-2

Вы должны справиться с этим сами, вычислить размер текста и каким-либо образом обернуть контент (сломать линию при максимальной ширине или обернуть последнее слово).

Я уже делал это на Java SE с помощью FontMetrics, никогда не для Android; но вы должны смотреть:

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

Как отметил Лиза, StaticLayout это путь для измерения обтекания текста.

+0

Что ты имеешь в виду? Я действительно борюсь с этим, поскольку я довольно новый. Кажется, из чтения всех других потоков предпочтительным является метод StaticLayout? –

+0

Компоненты, которые расширяют представление, не будут рисовать ничего до тех пор, пока не будет вычислен макет и мера, вам может понадобиться вызов sl.measure (100,100, ширина, высота), затем рисовать. Но я знаю, что измерение ширины символов для обертывания содержимого может быть выполнено. –

+2

StaticLayout специально предназначен для рендеринга многострочного текста, в том числе для обработки линии. Вы должны абсолютно использовать его для рисования текста на холсте в любом случае, когда вы «соблазняетесь напрямую вызвать Canvas.drawText()». Поверьте мне, вы НЕ хотите попасть в свою собственную линию. 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; 
} 

Источник: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/