2012-08-12 34 views
7

TextView.setLineSpacing() öğesine 'add' ekleyerek bir TextView'daki satır aralığını azaltmaya çalışıyorum. Alt çizginin kesilmesi dışında iyi çalışır.TextView satır aralığını azaltma

Ana düzeni

<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" /> 

ana faaliyet: (Bu görünümün altındaki kesme sonuçlanır

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"); 
    } 
} 

fark ('g' fark en alt satırda):

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

Sorun, yanlış düzen ölçümü ile ilgili olduğu görülmektedir. Ben

Düzgün kılmakla kalmamakta
android:layout_height="fill_parent" 

için TextView ayarlarsanız:

Using 'fill_parent' does not truncate the bottom line

Herhangi fikri nasıl düzeltilir? Yardım ederse çirkin çözümlere sahip olmam umurumda değil. Ayrıca FontForge'a erişimim var ve gerekiyorsa yazı tipi dosyasını değiştirebilirim.

+0

o olur mu ** yerleşik yazı tipleri ile de? Veya diğer özel yazı tipleri? Yazı tipi doğru iniş değerini bildirmiyor olabilir. Son satırda – kcoppock

+1

da -30f'nin LineSpacing'i uygulanmaktadır. Bu yüzden son satır düzgün görünmüyor. Bu durumda, 'in alt dolgusunu' 30'unu ayarlayabiliyorsunuz ... @ kcoppock 'iniş değerlerinde yanlış bir şey düşünmüyorum' –

+0

@kcoppock, typeface = Typeface.SANS_SERIF; – user1139880

cevap

0

Eğer dolgu çalışmazsa, kenar boşluğu işini yapmalıdır. Hala sorun yaşıyorsanız, satır aralığı değerini her zaman görünümün onMeasure yöntemine uygulayabilirsiniz. Bunun için bir custom component oluşturmanız ve onMide'ye uzatmanız gerekecektir.

+0

Android ekleme: layout_margin = "20dp" veya android: layout_marginBottom = "20dp" TextView'e yardımcı olmadı. Son satır hala kesildi. TextView istediği ölçüyü belirledikten sonra marjın ana görünüm tarafından eklendiğini düşünüyorum. Ayrıca özel bileşen önerisini de deneyeceğim. – user1139880

+0

Teşekkürler Jose. Özel bileşen fikri işe yarıyor gibi görünüyor. Burada kendi yanıtımı gör. Cevabınızı doğru cevap olarak işaretleyin. – user1139880

+0

Bu hatayı gideren bir TextView için bazı kodlar yayınladım. Umarım yardımcı olur. http://stackoverflow.com/a/13386208/445348 – cottonBallPaws

0

Sadece TextView xml bildirimine paddingBottom ekleyin, iyi bir sonuç üreten bir değer seçin. Ve sonuç olarak, diğer kaplamalar için değerleri ayarlayın (üst, sağa ve sola). Bu sorunu giderebilmeniz için

+0

Android: paddingBottom = "60dp" TextView eklenen dolguya eklenir ancak alt satır yazı tipi hala kısaltılır. Bkz. Http://imgur.com/du5xJ – user1139880

0

Jose'nin cevabına dayanarak yaptığım iş budur ve işe yarıyor gibi görünüyor. Yerleşim mekanizmasının karmaşıklığına çok aşina değilim. Bu kod güvenli mi? Onunla ilgili bir sorun mu var?

Düzen:

<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> 
N piksel dikey yüksekliği uzanır

Eklenen özel TextView'un:

enter image description here

+0

bu gerçekten sizin için çalışıyor mu?Benim için alt dolgu ile aynı davranır - metin görünümüne yer ekler ama son satır hala kırpılır – jab11

1
: altındaki kesilmeden

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);  
    } 
} 

Sonuç metin görünümü oluşturma

Güzel! Bu, işi yapacak ancak değişkenlere sahip olduğumuz her yerde sabit değerler koymamızın hiçbir zaman iyi bir fikir olmadığı anlamına gelmez. On lineSmacure değerlerini bir dinamyc biçiminde eklemek için lineSpacing değerlerini kullanabilirsiniz. Bu değerlerin her zaman "getLineSpacingExtra()" ve "getLineSpacingMultiplier()" ile erişilebilir olduğunu unutmayın. Veya daha da kolay bir şekilde özetlenebilir: "getLineHeight()".Bu değer onMeasure yönteminde yer alması gerektiğini bana hissediyor rağmen

, her zaman ihtiyacınız olan tam yüksekliğini ölçmek ve daha sonra basit bir çek yapabilirsiniz:

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

Son bir şey, sen don' Bağlamı ayrılmış bir öznitelikte geçirmeniz gerekir. Kurucularınıza bir bakışınız varsa, içerik zaten var. Eğer bileşeninizin kodu boyunca ihtiyaç duyduysanız, sadece "getContext()" kullanabilirsiniz.

Yardım edin.

6

Bu aynı sorun koştu ama aralık çarpanı az 1.

kullanmaya çalıştığı sırada otomatik olarak son satırın kesme giderir ve set gerektirmez TextView bir alt sınıfını yarattı Altta bilinen/sabit bir aralık.

Sadece bu sınıfı kullanın ve normalde kullanabilirsiniz, herhangi bir ek boşluk veya düzeltme uygulamanıza gerek yoktur. littleFluffyKittys cevap

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

iyi ama linespacing

Ben yüksekliği TextView'un ile yazı orijinal yüksekliğini karşılaştırarak gereken ek yüksekliğini hesaplamak xml aracılığıyla kuruldu eğer bazı cihazlarda işe yaramadı bir çizgi için hesaplar. Hat yüksekliği yazı tipinin yüksekliğinden küçükse, farklılık bir kez eklenir. lineSpacingMultiplier =:

Bu Propably düşük (sadece bir alt test) en az API 10

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

Bu eller burada en iyi çözümdür. –

+0

Eğer satır aralığını programsal olarak azaltmam gerekiyorsa, yani 'setLineSpacing (float, float)' çözümünüze nerede sığar? – ericn

0

için bu metin görünümünde **

robot satır boşluğu azaltmak için aşağı işleri "0.8"

İlgili konular