2013-08-26 28 views
12

現在、イメージエディタを作成していて、canvas.drawText()を使用してイメージの上にテキストを描画しようとしています。これまで私はこれまで成功してきましたが、ユーザーが長すぎるテキストを入力した場合、テキストはページの1行にそのまま残り、画面の幅に折り返されません。これをどうやってやりますか?私は静的なレイアウトを使用しようとしたが、それを動作させるように見えることができない、誰かがこれを行うためのチュートリアルを持っていますか?AndroidのdrawText(テキストの折り返しを含む)

静的レイアウト使用してキャンバス上に描画するためのMy機能:

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 'の良い使用例については、この他の答えを見てみましょう: //stackoverflow.com/a/8369690/293280 –

+0

[キャンバスに複数行のテキストを描画]の複製可能(http://stackoverflow.com/questions/6756975/draw-multi-line-text-to-canvas) –

答えて

11

はい、StaticLayout です。キャンバスに複数行テキストを描画するために使用するものです。自分自身を痛みの世界に救い、自分自身でテキストを壊すことは考えないでください。正しい道のりです。私はビットマップの問題についてはわかりませんが、上記の2番目のコードは、私のためにキャンバスにテキストを描画するのにうまくいきました。

これは、キャンバス上のレイアウトを描く方法です: http://developer.android.com/reference/android/text/Layout.html#draw(android.graphics.Canvas)

+0

StaticLayoutはキャンバスに直接描画メソッドを持っていないので、サンプルを提供してください(キャンバスには描画(text.layout)はありません) –

+0

また、私の答えは正しいですが、それは最良の方法ではありません。これはどれくらい不公平なのですか –

+0

マルコスの解決策が実際に動作することを確認できます。最後に次の行を追加するのを忘れてしまいました。iv_ttx.setImageBitmap .....マルコに感謝します。 –

-2

テキストサイズを計算し、何らかの方法でコンテンツをラップする(最大幅で折れ線を付ける、または最後の単語を折り返す)必要があります。

私は既にFontMetricsを使ってJava SE上で行っていますが、Android用ではありません。

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

リサによって指摘されているように、StaticLayoutはテキストの折り返しを測定する方法です。

+0

どういう意味ですか?私はかなり新しくて、これで本当に苦労しています。 StaticLayoutメソッドが優先される他のすべてのスレッドを読み込んでいるようですか? –

+0

Viewを拡張するコンポーネントは、レイアウトとメジャーが呼び出されるまで描画されません。sl.measure(100,100、width、height)を呼び出して描画する必要があります。しかし、コンテンツをラップするために文字の幅を測定することができます。 –

+2

StaticLayoutは、特に改行を処理するなど、複数行のテキストを描画するためのものです。 Canvas.drawText()を直接呼び出すようにしたい場合は、必ずCanvas上にテキストを描画する必要があります。私を信じて、あなたは自分のラインに侵入したくない。 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:http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/

関連する問題