2014-03-06 11 views
18

Ich versuche, eine blaue Linie angezeigt werden neben einem Textblock, so ziemlich wie folgt aus:android: fit Höhe von DrawableLeft in einem Textview

enter image description here

Hier ist mein Code:

<TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:drawableLeft="@drawable/blue_line" /> 

blue_line ist eine JPG-Datei. ein blaues Rechteck. Es wird in seiner Originalgröße unabhängig vom Text in der Textansicht angezeigt. Wie kann ich die Höhe dynamisch an die Höhe des Textes anpassen? wie macht es kürzer, wenn Theres wenig Menge an Text und länger, wenn es mehr Text ....

+1

ein QuoteSpan verwenden oder einen LeadingMarginSpan – pskink

+0

ich versuchte quotespan es genial scheint, aber gibt es eine Möglichkeit, die Breite der Linie zu erhöhen? und wie man leadmarginspan benutzt? –

Antwort

1

wie unten Versuchen ...

<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:src="@drawable/btndr" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/imageView" /> 

</RelativeLayout> 
-1

Sie benötigen ein ein horizontales XML-Layout zu machen, das das Blau hat Zeile links und eine Textansicht rechts. Dann verwenden Sie das Layout wie ein Element und erstellen Sie eine ListView dieser Elemente. So etwas wie here, aber ein bisschen einfacher

22

Sie können versuchen, es im Code tun, indem Grenzen für das Bild

textView1.getViewTreeObserver() 
     .addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Drawable img = ActivityName.this.getContext().getResources().getDrawable(
       R.drawable.blue_line); 
      img.setBounds(0, 0, img.getIntrinsicWidth() * textView1.getMeasuredHeight()/img.getIntrinsicHeight(), textView1.getMeasuredHeight()); 
      textView1.setCompoundDrawables(img, null, null, null); 
      textView1.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } 
    }); 
2

einfach, Halten Sie Ihr Bild als 9patch ziehbar Einstellung.

Sie können android:drawableLeft="@drawable/checkmark" zu Ihrer Textansicht hinzufügen. Sie können auch drawablePadding festlegen, um die Textansicht zu organisieren.

android:drawableLeft="@drawable/button_icon" 
android:drawablePadding="2dip" 

Hier ist der Link 9patch drawable

<TextView android:text="@string/txtUserName" 
android:id="@+id/txtUserName" 
android:layout_width="160dip" 
android:layout_height="60dip" 
android:layout_gravity="center" 
android:drawableLeft="@drawable/button_icon" 
android:drawablePadding="2dip" 
/> 
+0

okay, ich versuche, ich habe noch nie eine 9patch verwendet ... –

+0

Versuchen Sie, die Ebene ziehbar, wenn es gestreckt oder gequetscht ist, gehen Sie für 9patch. @Tekno Freek. –

5

Die beste Art zu schaffen, dies zu tun ist Ihren ziehbar in einer XML-ziehbar Datei zu wickeln und sie als ziehbar in Ihrer Textansicht wie folgt festgelegt :

Drawable XML-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:scaleType="fitXY" 
    android:src="@drawable/total_calories"/> 

Textview in XML:

<TextView 
    android:id="@+id/title_total_cal" 
    style="@style/title_stats_textview" 
    android:drawableLeft="@drawable/total_calories_drawable"/> 
+4

hast du das getestet? Funktioniert nicht für mich (auf Knopfdruck). Das Bild wird immer noch beschnitten. – hcpl

+0

Post in einer neuen Frage mit Ihrem XML –

1

Sie können auf der Zeichenfläche eine Linie mit der gewünschten Höhe zeichnen und als Textauszug für die linke Seite festlegen. Check this out:

public class FullHeightLineDrawable extends Drawable { 
    private Paint mPaint; 
    private int mHeight; 

    public FullHeightLineDrawable(int height) { 
     mPaint = new Paint(); 
     mPaint.setColor(CompatUtils.getColor(R.color.colorAccent)); 
     mPaint.setAntiAlias(true); 
     mPaint.setStrokeWidth(15); 

     mHeight = height; 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     canvas.drawLine(0, -mHeight, 0, mHeight, mPaint); 
    } 

    @Override 
    public void setAlpha(int alpha) { 
    } 

    @Override 
    public void setColorFilter(ColorFilter colorFilter) { 
    } 

    @Override 
    public int getOpacity() { 
     return 0; 
    } 
} 

Verbrauch:

final Drawable drawable = new FullHeightLineDrawable(getHeight()); 
mTextView.setTextColor(watchingColor); 
mTextView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); 
0

ich abstrahieren diese Methode. Es funktioniert, wenn das Zeichen links von der Textansicht dynamisch skaliert wird. Wenn ziehbar auf der rechten Seite ist, funktioniert diese Methode nicht funktioniert, benötigt warum, um herauszufinden, aber man kann direkt nur textView.setcompounddrawableswithintrinsicbounds() verwenden, um mit der rechten Größe Drawable Ressource

@RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) 
public static void ajustCompoundDrawableSizeWithText(final TextView textView, final Drawable leftDrawable, final Drawable topDrawable, final Drawable rightDrawable, final Drawable bottomDrawable) { 
    textView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
     @Override 
     public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
      if(leftDrawable != null){ 
       leftDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); 
      } 
      if(topDrawable != null){ 
       topDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); 
      } 
      if(rightDrawable != null){ 
       rightDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); 
      } 
      if(bottomDrawable != null){ 
       bottomDrawable.setBounds(0, 0, (int)textView.getTextSize(), (int)textView.getTextSize()); 
      } 
      textView.setCompoundDrawables(leftDrawable, topDrawable, rightDrawable, bottomDrawable); 
       textView.removeOnLayoutChangeListener(this); 
     } 
    }); 
} 
0

ich eine Klasse erstellt, die TextView erstreckt, und die Größe der Zeichen in onPreDrawListener ändern.

public class MyTextView extends AppCompatTextView { 

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

    private void fitCompoundDrawableToLineHeight() { 
     OnPreDraw.run(this,() -> { 
      final Drawable[] cd = getCompoundDrawables(); 
      Arrays.stream(cd) 
       .filter(drawable -> drawable != null) 
       .forEach(d -> d.setBounds(0, 0, getLineHeight(), getLineHeight())); 
      setCompoundDrawables(cd[0], cd[1], cd[2], cd[3]); 
     }); 
    } 
} 

// Convenience class that abstracts onPreDraw logic 
public class OnPreDraw { 
    public static void run(View view, Runnable task) { 
     view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       if (!view.getViewTreeObserver().isAlive()) { 
        return true; 
       } 
       view.getViewTreeObserver().removeOnPreDrawListener(this); 
       task.run(); 
       return true; 
      } 
     }); 
    } 
} 
Verwandte Themen