2012-08-12 43 views
7

को कैसे कम करें I TextView.setLineSpacing() में नकारात्मक 'एड' सेट करके टेक्स्ट व्यू में लाइन स्पेसिंग को कम करने का प्रयास कर रहा हूं। यह अच्छी तरह से काम करता है सिवाय इसके कि नीचे की रेखा को छोटा कर दिया जाता है।टेक्स्टव्यू लाइन स्पेसिंग

मुख्य लेआउट

<TextView 
    android:id="@+id/text_view" 
    android:padding="dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    tools:context=".MainActivity" /> 

मुख्य गतिविधि: (नोटिस

package com.font_test; 

import android.app.Activity; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/custom_fonts.ttf"); 
     final TextView tv = (TextView) findViewById(R.id.text_view); 
     tv.setTypeface(typeface); 
     tv.setTextSize(60); 
     tv.setLineSpacing(-30f, 1f); // *** -30 to reduce line spacing 
     tv.setBackgroundColor(0x280000ff); 
     tv.setText("gggkiiikkk" + "\n" + "gikgikgik" + "\n" + "kigkigkig"); 
    } 
} 

यह दृश्य के निचले भाग में काट-छांट में जो परिणाम (नोटिस 'जी' नीचे की रेखा पर):

Reducing the line spacing cuts the 'g' at the bottom line

ऐसा लगता है कि समस्या गलत लेआउट माप से संबंधित है। अगर मैं

android:layout_height="fill_parent" 

यह ठीक से प्रस्तुत करता है TextView सेट:

Using 'fill_parent' does not truncate the bottom line

किसी भी विचार है कि यह कैसे तय करने के लिए? अगर यह मदद करता है तो मुझे बदसूरत कामकाज करने की कोई बात नहीं है। मेरे पास FontForge तक पहुंच है और यदि आवश्यक हो तो मैं फ़ॉन्ट फ़ाइल को संशोधित कर सकता हूं।

+0

यह होता है अंतर्निहित फोंट के साथ भी? या कोई अन्य कस्टम फोंट? यह हो सकता है कि फ़ॉन्ट सही मूल मूल्य की रिपोर्ट नहीं कर रहा है। पिछली पंक्ति पर – kcoppock

+1

'लाइनस्पेसिंग ऑफ -30 एफ' भी लागू हो रहा है। यही कारण है कि अंतिम पंक्ति ठीक से नहीं देखा जाता है। इसलिए आप अपने मामले में 30 में से नीचे पैडिंग सेट कर सकते हैं ... @ kcoppock मुझे लगता है कि 'मूल मूल्य' –

+0

@kcoppock में कोई भी चीज़ गलत नहीं है, मुझे टाइपफ़ेस = Typeface.SANS_SERIF के साथ एक ही समस्या मिलती है; – user1139880

उत्तर

0

यदि पैडिंग काम नहीं करती है, तो मार्जिन को नौकरी करना चाहिए। यदि आपको अभी भी समस्या है तो आप दृश्य के ऑन मेजर विधि पर लाइन स्पेसिंग मान को हमेशा लागू कर सकते हैं। इसके लिए आपको custom component बनाना होगा और मेजर पर विस्तार करना होगा।

+0

एंड्रॉइड जोड़ना: layout_margin = "20dp" या एंड्रॉइड: TextView में layout_marginBottom = "20dp" मदद नहीं करता था। आखिरी पंक्ति अभी भी छोटा कर दी गई है। मुझे लगता है कि टेक्स्ट व्यू ने वांछित उपाय निर्धारित करने के बाद मार्जिन को मूल दृश्य द्वारा जोड़ा गया है। मैं आपको कस्टम घटक सुझाव भी आज़माउंगा। – user1139880

+0

धन्यवाद जोस। कस्टम घटक विचार काम करने लगता है। मेरा अपना जवाब यहां देखें। अपने उत्तर को सही उत्तर के रूप में चिह्नित करना। – user1139880

+0

मैंने टेक्स्टव्यू के लिए कुछ कोड पोस्ट किया जो इस बग को हल करता है। आशा करता हूँ की ये काम करेगा। http://stackoverflow.com/a/13386208/445348 – cottonBallPaws

0

बस अपने टेक्स्ट व्यू एक्सएमएल की घोषणा के लिए पैडिंगबॉटम जोड़ें, एक ऐसा मूल्य चुनें जो एक अच्छा परिणाम उत्पन्न करता हो। और इसके परिणामस्वरूप अन्य पैडिंग के लिए मूल्य निर्धारित करें (शीर्ष, चलो और दाएं)। इससे आपकी समस्या ठीक होनी चाहिए

+0

एंड्रॉइड जोड़ना: टेक्स्टव्यू में पैडिंगबॉटम = "60 डीपी" जोड़ा पैडिंग लेकिन नीचे लाइन फ़ॉन्ट अभी भी छोटा कर दिया गया है। देखें http://imgur.com/du5xJ – user1139880

0

यही वह है जो मैंने जोस के उत्तर के आधार पर किया था और ऐसा लगता है कि यह काम करता है। मैं लेआउट तंत्र की जटिलता से बहुत परिचित नहीं हूं। क्या यह कोड सुरक्षित है? इसके साथ कोई समस्या है?

लेआउट:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <com.font_test.MyTextView 
     android:id="@+id/text_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     tools:context=".MainActivity" /> 

</RelativeLayout> 
कि एन पिक्सल द्वारा खड़ी ऊंचाई फैली

जोड़ा गया कस्टम TextView:

enter image description here

+0

क्या यह वास्तव में आपके लिए काम करता है?मेरे लिए यह नीचे पैडिंग के समान कार्य करता है - टेक्स्टव्यू में स्थान जोड़ता है लेकिन अंतिम पंक्ति अभी भी – jab11

1
: निचले भाग में काट-छांट के बिना

package com.font_test; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.TextView; 

public class MyTextView extends TextView { 

    public MyTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     // TODO: provide an API to set extra bottom pixels (50 in this example) 
     setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + 50);  
    } 
} 

परिणाम पाठ दृश्य प्रतिपादन

अच्छा! यह नौकरी करेगा लेकिन जहां भी हमारे पास चर हैं, वहां स्थिरांक मूल्यों को रखना कभी भी अच्छा विचार नहीं है। आप लाइनस्पेसिंग मानों का उपयोग इन्हें डायनेमिक तरीके से ऑनमेज़र विधि में जोड़ने के लिए कर सकते हैं। ध्यान दें कि यह मान हमेशा "getLineSpacingExtra()" और "getLineSpacingMultiplier()" के माध्यम से उपलब्ध होते हैं। या इससे भी आसान आप सारांशित दोनों का मूल्य प्राप्त कर सकते हैं: "getLineHeight()"।

हालांकि यह मेरे लिए लगता है कि यह मान onMeasure विधि में शामिल किया जाना चाहिए, तो आप हमेशा सटीक ऊंचाई आप की जरूरत का आकलन कर सकते हैं और फिर एक सरल जांच करें:

final int measuredHeight = getMeasuredHeight(); 
if (measuredHeight < neededHeight) { 
    setMeasuredDimension(getMeasuredWidth, neededHeight); 
} 

एक आखिरी बात, आप डॉन ' एक अलग विशेषता में संदर्भ को पारित करने की आवश्यकता नहीं है। यदि आप अपने रचनाकारों के लिए एक नज़र रखते हैं, तो संदर्भ पहले से ही है। यदि आपको अपने घटक के कोड के साथ जरूरी है तो आप "getContext()" का उपयोग कर सकते हैं।

उम्मीद है कि यह मदद करता है।

6

मैं इस एक ही समस्या में पड़ गए लेकिन मैं TextView का एक उपवर्ग कि अंतिम पंक्ति की काट-छांट स्वचालित रूप से ठीक करता है और आप तैयार की आवश्यकता नहीं है बनाया जब मैं एक रिक्ति गुणक कम से कम 1.

उपयोग करने के लिए कोशिश कर रहा था नीचे एक ज्ञात/निश्चित दूरी।

बस इस कक्षा का उपयोग करें और आप इसे सामान्य रूप से उपयोग कर सकते हैं, आपको किसी भी अतिरिक्त अंतर या फिक्स को लागू करने की आवश्यकता नहीं है।

public class ReducedLineSpacingTextView extends TextView { 

    private boolean mNegativeLineSpacing = false; 

    public ReducedLineSpacingTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public ReducedLineSpacingTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ReducedLineSpacingTextView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     if (mNegativeLineSpacing) { // If you are only supporting Api Level 16 and up, you could use the getLineSpacingExtra() and getLineSpacingMultiplier() methods here to check for a less than 1 spacing instead. 
      Layout layout = getLayout(); 
      int truncatedHeight = layout.getLineDescent(layout.getLineCount()-1); 
      setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + truncatedHeight); 
     } 
    } 

    @Override 
    public void setLineSpacing(float add, float mult) { 
     mNegativeLineSpacing = add < 0 || mult < 1; 
     super.setLineSpacing(add, mult); 
    } 

} 
9

littleFluffyKittys का जवाब अच्छा है, लेकिन यह कुछ उपकरणों पर काम नहीं किया है, तो linespacing एक्सएमएल के माध्यम से स्थापित किया गया था

मैं ऊंचाई TextView के साथ फ़ॉन्ट का मूल ऊंचाई की तुलना द्वारा आवश्यक अतिरिक्त ऊंचाई की गणना एक लाइन के लिए गणना करता है। यदि लाइन ऊंचाई फ़ॉन्ट की ऊंचाई से छोटी है तो अंतर एक बार जोड़ा जाता है। lineSpacingMultiplier =:

यह कम से कम एपीआई 10 propably कम (बस किसी भी कम का परीक्षण नहीं)

public class ReducedLineSpacingTextView extends TextView { 

    public ReducedLineSpacingTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public ReducedLineSpacingTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ReducedLineSpacingTextView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int truncatedHeight = getPaint().getFontMetricsInt(null) - getLineHeight(); 
     if (truncatedHeight > 0) { 
      setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + truncatedHeight); 
     } 
    } 

} 
+1

पर फिसल गई है यह हाथों पर सबसे अच्छा समाधान है। –

+0

क्या होगा यदि मुझे लाइन स्पेसिंग प्रोग्रामेटिक रूप से कम करने की आवश्यकता है यानी 'setLineSpacing (फ्लोट, फ्लोट)' आपके समाधान में फिट बैठता है? – ericn

0

उपयोग इस पाठ को देखने **

एंड्रॉयड में पंक्ति रिक्ति को कम करने के लिए नीचे काम करता है "0.8"

**