web-dev-qa-db-de.com

android: passt die Höhe von DrawableLeft in eine Textansicht an

Ich versuche, neben einem Textblock eine blaue Linie anzuzeigen, so ziemlich wie folgt:

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 unabhängig vom Text in der Textansicht in seiner Originalgröße angezeigt. Wie kann ich die Höhe dynamisch an die Höhe des Texts anpassen? mag es kürzer machen, wenn wenig Text vorhanden ist, und länger, wenn mehr Text vorhanden ist ....

25
user1659274

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

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);
        }
    });
28
vipul mittal

Der beste Weg, dies zu tun, besteht darin, Ihre Zeichenbar in eine XML-Datei zu verpacken und sie wie folgt in Ihrer Textansicht als Zeichenweise festzulegen:

Zeichenbare 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"/>
6
Droid Chris

Versuchen Sie es als unten ...

<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>
3
Hamid Shatu

Behalten Sie einfach Ihr Bild als 9patch-Zeichen.

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

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

Hier ist der Link zum Erstellen von 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"
/>  
2

Sie können eine Linie mit der gewünschten Höhe auf der Zeichenfläche zeichnen und als links für Ihre Textansicht festlegen. überprüfen Sie dies heraus:

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

Verwendungszweck:

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

Ich habe eine Klasse erstellt, die TextView erweitert, und die Zeichengröße 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;
            }
        });
    }
}
0
guy.gc

Leider funktionierte setBounds nicht für mich und ich musste einen Workaround machen.

// Turn wanted drawable to bitmap
Drawable dr = getResources().getDrawable(R.drawable.somedrawable);
Bitmap bitmap = ((BitmapDrawable) dr).getBitmap();

// I had a square image with same height and width so I needed only TextView height (getLineHeight)
int size = textView1.getLineHeight();
Drawable d = new BitmapDrawable(getResources(), Bitmap.createScaledBitmap(bitmap, size, size, true));
textView1.setCompoundDrawables(d, null, null, null);

// Now we can set some spacing between text and image
textView1.setCompoundDrawablePadding(10);

Es ist nicht die beste Lösung in Bezug auf die Leistung, da eine neue Bitmap erstellt wird, aber trotzdem funktioniert.

0
Tomislav Brabec

Ich abstrahiere diese Methode aus. Es funktioniert, wenn sich die Zeichenfläche auf der linken Seite der Textansicht befindet und dynamisch skaliert wird. Wenn sich drawable auf der rechten Seite befindet, funktioniert diese Methode nicht. Sie müssen herausfinden, warum, aber Sie können textView.setcompounddrawableswithintrinsicbounds() direkt mit der drawable-Ressource mit der richtigen Größe verwenden

@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
KyleZB