2013-08-26 6 views
12

현재 이미지 편집기를 만들고 있는데 canvas.drawText()를 사용하여 이미지 위에 텍스트를 그리려하고 있습니다. 지금까지이 작업을 성공적으로 수행했지만 사용자가 너무 긴 텍스트를 입력하면 텍스트가 페이지의 한 줄에서 계속 나타나며 화면 너비에 맞게 줄 바꿈되지 않습니다. 이 일을 어떻게 하죠? 나는 정적 인 레이아웃을 사용해 보았지만 작동시키지 못했고, 이것을하기위한 튜토리얼을 누군가 가지고 있 었는가?안드로이드 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'의 좋은 사용 예를 들어이 다른 대답을 살펴보십시오 : //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에는 캔버스에 직접 그릴 방법이 없으므로 샘플을 제공하십시오. 캔버스에는 그리기가 없습니다 (text.layout) –

+0

또한 내 대답은 정확하지만 가장 좋은 방법은 아닙니다. 이것이 얼마나 불공 평한 지 –

+0

Marcos 솔루션이 실제로 작동하는지 확인할 수 있습니다. 끝에 다음 줄을 추가하는 것을 잊어 버렸습니다. iv_ttx.setImageBitmap (이미지) ..... Marco. 감사합니다. –

-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()를 직접 호출하려는 유혹이있는 경우에는 반드시 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/