2013-08-26 7 views
12

Obecnie tworzę edytor obrazów i próbuję narysować tekst na górze obrazu przy użyciu canvas.drawText(). Do tej pory udało mi się to zrobić, ale gdy użytkownik wprowadzi tekst, który jest zbyt długi, tekst jest kontynuowany w jednym wierszu poza stroną i nie owija się na szerokość ekranu. Jak miałbym to zrobić? Próbowałem użyć statycznego układu, ale nie wydaje się, aby to działało, czy ktoś ma samouczek, aby to zrobić?Android drawText z zawijaniem tekstu

Moja funkcja do rysowania na płótnie przy użyciu układu statycznego:

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

Ok, mam zaktualizowany mojego kodu, ale gdy próbuję zwrócić na zdjęciu nic nie dzieje się w ogóle, nie mam pojęcia dlaczego albo:

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

Czy użycie gry staticlayout nie jest przeznaczone do rysowania na płótnie?

+0

Spójrz na tej drugiej odpowiedzi na dobry przykład użytkowej 'StaticLayout's: http: //stackoverflow.com/a/8369690/293280 –

+0

możliwy duplikat [narysuj tekst wieloliniowy na płótnie] (http://stackoverflow.com/questions/6756975/draw-multi-line-text-to-canvas) –

Odpowiedz

11

Tak, StaticLayout to co ma służyć do rysowania tekstu wieloliniowego na płótnie. Oszczędź sobie świata bólu i nie myśl o łamaniu tekstu - jesteś na dobrej drodze. Nie jestem pewien co do problemu z bitmapą, ale twój drugi kod działa dobrze, aby narysować tekst na płótnie.

ten sposób można narysować układ na płótnie: http://developer.android.com/reference/android/text/Layout.html#draw(android.graphics.Canvas)

+0

Proszę podać próbkę, ponieważ StaticLayout nie ma żadnej metody bezpośredniego narysowania na płótnie (i Canvas dont ma żadnego remisu (text.layout)) –

+0

Również moja odpowiedź jest poprawna, ale to nie jest najlepszy sposób .. tylko do ciebie, aby zobaczyć jak niesprawiedliwe to jest –

+0

Potrafię potwierdzić, że rozwiązanie Marcos rzeczywiście działa, zapomniałem dodać na końcu następującego wiersza, iv_ttx.setImageBitmap (image) ..... Dziękuję Marco. –

-2

Powinieneś sam sobie z tym poradzić, obliczając rozmiar tekstu i zawijając zawartość w jakiś sposób (linia przerywana przy maksymalnej szerokości lub zawiń ostatnie słowo).

Zrobiłem to już na Java SE z FontMetrics, nigdy dla Androida; ale trzeba spojrzeć:

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

Jak wskazano przez Lisa, StaticLayout jest sposobem, aby przejść do pomiaru zawijanie tekstu.

+0

Jak masz na myśli? Naprawdę walczę z tym, ponieważ jestem całkiem nowy. Z czytania wszystkich innych wątków wynika, że ​​preferowana jest metoda StaticLayout? –

+0

Komponenty, które rozszerzają Widok, nie narysują niczego, dopóki nie zostanie wywołany układ i miara, możesz potrzebować wywołania sl.measure (100,100, szerokość, wysokość), a następnie narysować. Ale wiem, że można zmierzyć szerokość znaków do zawijania treści. –

+2

StaticLayout jest przeznaczony do renderowania tekstu wielowierszowego, w tym do łamania linii. Powinieneś bezwzględnie użyć go do narysowania tekstu na płótnie w każdym przypadku, w którym "miałbyś ochotę zadzwonić bezpośrednio do Canvas.drawText()". Zaufaj mi, NIE chcesz się włamać do swojej linii. 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; 
} 

źródło: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/

Powiązane problemy