2012-10-16 10 views
8

मैं अब पिछले कुछ दिनों के लिए यह एक यह पता लगाने की कोशिश कर रहे हैं, और कोई सफलता मिली है ...एंड्रॉयड Spannable पंक्ति की ऊंचाई

मैं एंड्रॉयड सीख रहा हूँ अभी, और वर्तमान में एक कैलकुलेटर बनाने हूँ इतिहास के साथ मेरी शिक्षा परियोजना के रूप में। मेरे पास एक टेक्स्ट व्यू है जो सभी इतिहास प्रदर्शित करने के लिए ज़िम्मेदार है ... मैं एक डिजिटल फ़ॉन्ट का उपयोग कर रहा हूं जो कैलकुलेटर फ़ॉन्ट की तरह दिखता है, लेकिन यह केवल अंकों और दशमलव और अल्पविरामों के लिए अच्छा दिखता है। मैं चाहता हूं कि सभी ऑपरेटरों को हाइलाइट किया जाए और एक अलग फ़ॉन्ट में (इस समय एरियल संकीर्ण)। मैं इसे एक स्पैन करने योग्य स्ट्रिंग का उपयोग करके खूबसूरती से काम करने में सक्षम हूं, जहां मैं अपने कस्टम फोंट को लागू करने के लिए एक कस्टम रंग के साथ-साथ एक कस्टम टाइप टाइप स्पेस क्लास का उपयोग कर एक फ़ॉन्ट निर्दिष्ट कर रहा हूं।

समस्या ... जब मैं टाइपफेस को मिलाता हूं, तो लाइन ऊंचाई के साथ एक समस्या प्रतीत होती है, इसलिए मुझे this post मिला जो स्पैन करने योग्य टेक्स्ट की प्रत्येक अतिरिक्त पंक्ति में लाइन ऊंचाई लागू करने के लिए एक और कस्टम परिभाषित वर्ग का उपयोग करता है:

public class CustomLineHeightSpan implements LineHeightSpan{ 
    private final int height; 

    public CustomLineHeightSpan(int height){ 
     this.height = height; 
    } 

    @Override 
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, FontMetricsInt fm) { 
     fm.bottom += height; 
     fm.descent += height; 
    } 

} 

यह काम नहीं प्रतीत होता है, और मैं यह नहीं समझ सकता कि क्यों। यदि मैं अलग-अलग टाइपफेस लागू नहीं करता हूं, तो यह पहली पंक्ति के ऊपर कोई स्थान नहीं, और लाइनों के बीच लगभग 5px रिक्ति के साथ अपेक्षित प्रदर्शित करता है। जब मैं वैकल्पिक टाइपफेस लागू करता हूं, तो पाठ की पहली पंक्ति के ऊपर लगभग 10 से 15px की जगह होती है और रेखा अंतर लगभग 10 से 15px के बारे में होता है।

फ़ॉन्ट आकार, केवल टाइपफ़ेस में कोई अंतर नहीं है। मैं क्या खो रहा हूँ। मैंने कस्टमलाइन हाइटस्पैन लागू किया जो लाइनहेइटस्पैन लागू करता है और चुनिंदा हाइट विधि को ओवरराइड करता है। मैं इसे इस प्रकार कहता हूं:

वर्डटोस्पेन.सेटस्पैन (नया कस्टमलाइन हाइटस्पैन (10), ऑपरेटरपॉशन.जेट (ii), ऑपरेटरपॉशन .get (ii) + 1, स्पैन करने योग्य .SPAN_EXCLUSIVE_EXCLUSIVE);

ऐसा लगता है कि मैंने कस्टमलाइन हेइटस्पैन को कॉल में क्या रखा है। कुछ भी नहीं बदलता है ...

किसी को भी कोई विचार है कि मुझे क्या याद आ रहा है ... मुझे यकीन है कि यह एक "मुझे विश्वास नहीं है कि मुझे यह याद आया" जवाब है, लेकिन इसे समझ में नहीं आता पल।

मदद लोग :-)

उत्तर

17

मैं अंत में LineHeightSpan के उपयोग की गहराई उदाहरण में एक और अधिक पाया करने के लिए धन्यवाद ... असल में LineHeightSpan.WithDensity अधिक स्पष्ट होने के ... निम्नलिखित अंश है कि मदद की है मुझे अपनी समस्या का समाधान करने के लिए:

private static class Height implements LineHeightSpan.WithDensity { 
    private int mSize; 
    private static float sProportion = 0; 

    public Height(int size) { 
     mSize = size; 
    } 

    public void chooseHeight(CharSequence text, int start, int end, 
          int spanstartv, int v, 
          Paint.FontMetricsInt fm) { 
     // Should not get called, at least not by StaticLayout. 
     chooseHeight(text, start, end, spanstartv, v, fm, null); 
    } 

    public void chooseHeight(CharSequence text, int start, int end, 
          int spanstartv, int v, 
          Paint.FontMetricsInt fm, TextPaint paint) { 
     int size = mSize; 
     if (paint != null) { 
      size *= paint.density; 
     } 

     if (fm.bottom - fm.top < size) { 
      fm.top = fm.bottom - size; 
      fm.ascent = fm.ascent - size; 
     } else { 
      if (sProportion == 0) { 
       /* 
       * Calculate what fraction of the nominal ascent 
       * the height of a capital letter actually is, 
       * so that we won't reduce the ascent to less than 
       * that unless we absolutely have to. 
       */ 

       Paint p = new Paint(); 
       p.setTextSize(100); 
       Rect r = new Rect(); 
       p.getTextBounds("ABCDEFG", 0, 7, r); 

       sProportion = (r.top)/p.ascent(); 
      } 

      int need = (int) Math.ceil(-fm.top * sProportion); 

      if (size - fm.descent >= need) { 
       /* 
       * It is safe to shrink the ascent this much. 
       */ 

       fm.top = fm.bottom - size; 
       fm.ascent = fm.descent - size; 
      } else if (size >= need) { 
       /* 
       * We can't show all the descent, but we can at least 
       * show all the ascent. 
       */ 

       fm.top = fm.ascent = -need; 
       fm.bottom = fm.descent = fm.top + size; 
      } else { 
       /* 
       * Show as much of the ascent as we can, and no descent. 
       */ 

       fm.top = fm.ascent = -size; 
       fm.bottom = fm.descent = 0; 
      } 
     } 
    } 
} 

यह this example से लिया गया था।

बलों पाठ लाइन, निर्दिष्ट ऊंचाई होने के लिए सिकुड़/खींच चढ़ाई यदि संभव हो तो, या वंश अगर चढ़ाई सिकुड़ आगे पाठ कर देगा:

के रूप में नीचे उद्धृत क्या यह करता है अपठनीय।

मुझे आशा है कि यह अगले व्यक्ति :-)

+1

कैसे इस विधि chooseHeight कॉल करने के लिए मदद करता है? – AndroidCrazy

+0

एंड्रॉइड आंतरिक रूप से इस विधि को कॉल करता है। आपको बस इतना करना है कि अपनी स्ट्रिंग को अवधि दें। यदि आप और जानना चाहते हैं, तो android.text.StaticLayout क्लास देखें। अन्य स्पैन के तरीकों को भी वहां बुलाया जाता है। – thehayro

+3

यदि हम कभी मिलते हैं तो मैं आपको एक बियर (या पसंद के अन्य पेय) का भुगतान करता हूं - यह सामान सुपर अनियंत्रित है, और इसे ढूंढने में पागल समय लगता है। – secureboot

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