2013-08-26 7 views
12

मैं वर्तमान में एक छवि संपादक बना रहा हूं और canvas.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; 
} 

क्या स्टेटिकलेआउट का उपयोग कैनवास पर आकर्षित करने के लिए नहीं किया जाना चाहिए?

+0

'StaticLayout's का एक अच्छा उपयोग उदाहरण के लिए इस अन्य जवाब पर एक नज़र डालें: //stackoverflow.com/a/8369690/293280 –

+0

संभावित डुप्लिकेट [कैनवास में बहु-पंक्ति पाठ ड्रा करें] (http://stackoverflow.com/questions/6756975/draw-multi-line-text-to-canvas) –

उत्तर

11

हां, स्टेटिकलायआउट है जिसका उपयोग आप कैनवास पर बहु-पंक्ति पाठ आकर्षित करने के लिए करना चाहते हैं। अपने आप को दर्द की दुनिया बचाओ और खुद को पाठ तोड़ने के बारे में मत सोचो - आप सही रास्ते पर हैं। मुझे बिटमैप समस्या के बारे में निश्चित नहीं है, लेकिन उपरोक्त आपका दूसरा कोड मेरे लिए कैनवास पर टेक्स्ट खींचने के लिए ठीक काम करता है।

इस तरह आप एक कैनवास पर एक लेआउट आकर्षित है: http://developer.android.com/reference/android/text/Layout.html#draw(android.graphics.Canvas)

+0

कृपया एक नमूना प्रदान करें, क्योंकि स्टेटिकलायआउट में कैनवास के लिए कोई प्रत्यक्ष ड्रॉ विधि नहीं है (और कैनवास में कोई ड्रॉ नहीं है (text.layout)) –

+0

इसके अलावा मेरा जवाब सही है, लेकिन यह सबसे अच्छा तरीका नहीं है .. बस आप को देखने के लिए यह –

+0

कितना अनुचित है मैं पुष्टि कर सकता हूं कि मार्कोस समाधान वास्तव में काम करता है, मैं अंत में निम्नलिखित पंक्ति को जोड़ना भूल गया, iv_ttx.setImageBitmap (छवि) ..... धन्यवाद मार्को। –

-2

आपको इसे स्वयं को संभालना चाहिए, टेक्स्ट आकार की गणना करना और सामग्री को किसी तरह से लपेटना चाहिए (अधिकतम चौड़ाई पर ब्रेक लाइन या अंतिम शब्द लपेटें)।

मैंने पहले से ही जावा एसई पर फ़ॉन्टमैट्रिक्स के साथ ऐसा किया है, एंड्रॉइड के लिए कभी नहीं; लेकिन आप एक बार देख लेना चाहिए:

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

लिसा द्वारा बताया के रूप में, StaticLayout टेक्स्ट रैपिंग को मापने के लिए जाने का रास्ता है।

+0

आपका क्या मतलब है? मैं वास्तव में इसके साथ संघर्ष कर रहा हूं क्योंकि मैं बहुत नया हूं। ऐसा लगता है कि StaticLayout विधि को अन्य सभी धागे पढ़ने से लगता है? –

+0

व्यय जो व्यय करता है, लेआउट और माप कहलाए जाने तक कुछ भी नहीं खींचा जाएगा, आपको कॉल sl.measure (100,100, चौड़ाई, ऊंचाई) की आवश्यकता हो सकती है। लेकिन मुझे पता है कि सामग्री को लपेटने के लिए वर्णों की चौड़ाई मापने के लिए किया जा सकता है। –

+2

स्टेटिकलाउट विशेष रूप से मल्टी-लाइन टेक्स्ट को प्रस्तुत करने के लिए है, जिसमें आपके लिए लाइन ब्रेकिंग हैंडलिंग शामिल है। किसी भी मामले में कैनवास पर टेक्स्ट खींचने के लिए आपको इसका बिल्कुल उपयोग करना चाहिए, जहां आप "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: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/

संबंधित मुद्दे