2010-07-15 7 views
10

मैं निम्नलिखित कोड का उपयोग कर इमोटिकॉन को लागू कर रहा हूँ:ImageSpan कट जाता है/गलत गठबंधन

  builder.setSpan(new ImageSpan(mContext, resId, ImageSpan.ALIGN_BASELINE), 
         start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

परिणाम (बिल्डर) एक TextView के लिए पाठ के रूप में स्थापित किया जाएगा। यह पाठ ठीक से काम करता है यदि अवधि पाठ से घिरा हुआ है, यानी जब प्रारंभ> 0 और अंत < लंबाई -1, लेकिन छवि को काटा जाता है (स्थानांतरित हो जाता है) यदि इसके चारों ओर कोई पाठ नहीं है। मुझसे इसका समाधान किस प्रकार होगा?

बहुत बहुत धन्यवाद।

+0

रिकॉर्ड के लिए, कई घंटों के लिए इस हल करने की कोशिश के बाद, दुर्भाग्य से मेरा मानना ​​है कि यह एक Android बग है और मैं डॉन एक "असली" समाधान नहीं देखते हैं। मैं @ स्लोमैन के जवाब की तरह मेरी स्माइली के बाद एक जगह जोड़ना समाप्त कर दिया। मैं उल्लेख करना चाहता हूं कि Google से Hangouts ऐप में एक ही समस्या है! संदेश इनपुट में एक एकल स्माइली जोड़ें, फिर एक स्पेस जोड़ें: स्माइली कुछ पिक्सेल द्वारा चलता है ... – BoD

उत्तर

3

ठीक है, के रूप में कोई सुझाव नहीं है, मैं इस बीच में निम्नलिखित समाधान का उपयोग करने जा रहा हूँ: अगर वहाँ कोई पाठ - इस मामले की छानबीन, उपयोग ALIGN_BOTTOM झंडा अन्यथा ALIGN_BASELINE का उपयोग करें ...

+0

अभी भी कोई बेहतर जवाब नहीं है? – Gohan

4

मैं भी भाग गया और एक उचित समाधान नहीं मिला। मेरे द्वारा उपयोग किए जाने वाले कामकाज इस तरह दिखते हैं:

if(message.length() == 1){ 
//This is a hack to get past an android bug that misaligns ImageSpan's when they are all alone. 
    message += " "; 
} 
builder = new SpannableStringBuilder(message); 
0

ड्रायबल की सीमा निर्धारित करने का प्रयास करें। उदाहरण के लिए:

 BitmapDrawable bmd = new BitmapDrawable(bm); 
     int width = bmd.getIntrinsicWidth(); 
     int height = bmd.getIntrinsicHeight(); 
     bmd.setBounds(
       0, 
       0, 
       (int)width, 
       (int)height); 

     ImageSpan img = new ImageSpan(bmd); 
     SpannableString spannableString = new SpannableString(
      someString); 
     spannableString.setSpan(
      img, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
+0

यह मेरे लिए कुछ भी नहीं बदला है। वास्तव में, ImageSpan के स्रोत को देखते हुए, ऐसा लगता है कि संसाधन आईडी का उपयोग करते समय seBounds को कॉल पहले ही किया जा चुका है, इसलिए ऐसा लगता है कि इससे समस्या ठीक नहीं होती है। – BoD

7

अपने समाधान करने के लिए जारी रखते हुए, यहाँ अपने कस्टम DynamicDrawableSpan मैं ImageSpan के स्थान पर इस्तेमाल करते हैं। draw() विधि (डायनामिक ड्रावेबलस्पैन और संशोधित से कॉपी) यह सुनिश्चित करता है कि बेसलाइन के साथ संरेखित करने से पहले टेक्स्ट है।

class StickerSpan extends DynamicDrawableSpan { 
    Drawable mDrawable; 

    public StickerSpan(Context context, Bitmap bitmap) { 
     super(DynamicDrawableSpan.ALIGN_BASELINE); 
     setBitmap(context, bitmap); 
    } 

    public void setBitmap(Context context, Bitmap bitmap) { 
     mDrawable = new BitmapDrawable(context.getResources(), bitmap); 
     int width = mDrawable.getIntrinsicWidth(); 
     int height = mDrawable.getIntrinsicHeight(); 
     mDrawable.setBounds(0, 0, width > 0 ? width : 0, height > 0 ? height : 0); 
    } 

    @Override 
    public Drawable getDrawable() { 
     return mDrawable; 
    } 

    @Override 
    public void draw(Canvas canvas, CharSequence text, 
        int start, int end, float x, 
        int top, int y, int bottom, Paint paint) { 
     Drawable b = mDrawable; 
     canvas.save(); 

     int transY = bottom - b.getBounds().bottom; 
     if (mVerticalAlignment == ALIGN_BASELINE) { 
      int textLength = text.length(); 
      for (int i = 0; i < textLength; i++) { 
       if (Character.isLetterOrDigit(text.charAt(i))) { 
        transY -= paint.getFontMetricsInt().descent; 
        break; 
       } 
      } 
     } 

     canvas.translate(x, transY); 
     b.draw(canvas); 
     canvas.restore(); 
    } 
} 
0

मेरे लिए मैंने इसे छविस्पैन में पारित करने से पहले ड्रॉइंग की सीमा निर्धारित नहीं की थी।

आप की तरह कुछ कर रही द्वारा drawable की "आंतरिक सीमा" सेट कर सकते हैं:

Drawable drawable = // what you use to create/get your drawable 
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
ImageSpan span = new ImageSpan(drawable); 
+0

यह केवल गलत नहीं है (यह 0, 0 होना चाहिए, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()) लेकिन फिक्सिंग के बाद भी, यह कम से कम मेरे लिए समस्या का समाधान नहीं करता है। – BoD

+0

परम के आदेश के बारे में आपका अधिकार आह। टाइपो फिक्स्ड। इसने मेरे मामले में पाठ को काट दिया। मेरा अनुमान है कि कुछ ऐसे मामले हैं जहां टेक्स्ट कटऑफ हो सकता है। यहां कुछ जवाब हर मामले के लिए काम नहीं कर सकते हैं, लेकिन यह संभव है कि यह किसी की मदद कर सके ताकि मैं इसे एक संभावित उत्तर के रूप में बनाए रख सकूं। – cottonBallPaws

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