it-swarm.com.de

Ist es möglich, Drawableleft & Drawableright in Textansicht zu skalieren?

Ich habe eine Liste mit dem Element ist eine TextView; und verwenden von drawableleft & drawableright, um die TextView. zu bestätigen. Das Problem ist, dass, wenn der Text in der Textansicht größer ist, drawableleft & drawableleft nicht automatisch anhand der Höhe der TextView skaliert wird.

Ist es möglich, die Höhe von drawableleft & drawableright in der Textansicht zu skalieren? (Ich habe 9 Patch-Bilder verwendet)

textview drawableleft & drawableright's height problem

47
hakim

Das könnte dir helfen. Es gibt zwei Eigenschaften scaleX und scaleY  

Der folgende Code verkleinert das Bild und den Text um 30%. Daher müssen Sie die Schriftgröße um so viele "sp" erhöhen, dass sie bei einer Größenänderung (skaliert) zu dem "sp" passt, das Sie bevorzugen.

Beispiel. Wenn ich die Schriftart auf 18 setze, dann sind 30% von 18 5,4sp. Dies ist ungefähr der Wert, auf den ich mich beziehe, denn wenn er skaliert wird, wird er zu 13sp

<TextView
        Android:textSize="18sp"
        Android:scaleX="0.7"
        Android:scaleY="0.7"

Als letztes müssen Sie CompundDrawable einstellen.

tview.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.xxx), null, null, null);
20
kirilv

Ich habe eine äquivalente Usecase gelöst, indem ich eine ScaleDrawable eingeführt und deren .getIntrisicHeight() überschrieben habe, so dass es mindestens die TextView-Höhe hat. Der TextView.addOnLayoutChangeListener-Teil, der erforderlich ist, um die Drawable bei einer TextView-Größenänderung erneut zu binden, funktioniert mit API11 +

Drawable underlyingDrawable = 
        new BitmapDrawable(context.getResources(), result);

// Wrap to scale up to the TextView height
final ScaleDrawable scaledLeft = 
        new ScaleDrawable(underlyingDrawable, Gravity.CENTER, 1F, 1F) {
    // Give this drawable a height being at
    // least the TextView height. It will be
    // used by
    // TextView.setCompoundDrawablesWithIntrinsicBounds
    public int getIntrinsicHeight() {
        return Math.max(super.getIntrinsicHeight(), 
                        competitorView.getHeight());
    };
};

// Set explicitly level else the default value
// (0) will prevent .draw to effectively draw
// the underlying Drawable
scaledLeft.setLevel(10000);

// Set the drawable as a component of the
// TextView
competitorView.setCompoundDrawablesWithIntrinsicBounds(
        scaledLeft, null, null, null);

// If the text is changed, we need to
// re-register the Drawable to recompute the
// bounds given the new TextView height
competitorView.addOnLayoutChangeListener(new OnLayoutChangeListener() {

    @Override
    public void onLayoutChange(View v, int left, int top, int right, 
            int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        competitorView.setCompoundDrawablesWithIntrinsicBounds(scaledLeft, null, null, null);
    }
});
7
blacelle

Ich hoffe das hilft

Textview tv = (TextView) findViewById(R.id.tv_dummy)
int imageResource =  R.mipmap.ic_image;
Drawable drawable = ContextCompat.getDrawable(context, imageResource);
int pixelDrawableSize = (int)Math.round(tv.getLineHeight() * 0.7); // Or the percentage you like (0.8, 0.9, etc.)
drawable.setBounds(0, 0, pixelDrawableSize, pixelDrawableSize); // setBounds(int left, int top, int right, int bottom), in this case, drawable is a square image
tv.setCompoundDrawables(
 null, //left
 null, //top
 drawable, //right
 null //bottom
);
3
Juan Marin

Ich habe keinen Weg gefunden. Aber das, was Sie zeigen, sieht aus wie eine Liste von Elementen. Jedes Element wäre ein LinearLayout horizontal mit imagesView von links nach rechts und Text in der Mitte. Die Bildgröße eines Android-Geräts: scaleType = "fitXY", um die Größenhöhe an die Höhe der Textansicht anzupassen. Wenn Sie keine Deformierung des Bildes wünschen, verwenden Sie scaleType = "CENTER_INSIDE". http://developer.Android.com/reference/Android/widget/ImageView.ScaleType.html

<LinearLayout
     Android:layout_width="fill_parent"
     Android:id="@+id/HeaderList" 
     Android:layout_gravity="top"
     Android:layout_height="wrap_content" >  


     <ImageView
         Android:id="@+id/backImg"
         Android:layout_width="fill_parent"
         Android:layout_height="fill_parent"
         Android:layout_centerInParent="true"
         Android:adjustViewBounds="true"
         Android:background="@color/blancotransless"
         Android:src="@drawable/header"
         Android:scaleType="fitXY" >
     </ImageView>

         <TextView 
             Android:layout_height="wrap_content"
             Android:layout_width="wrap_content" 
             Android:id="@+id/NameText"
             Android:text="The time of prayer" 
             Android:textColor="#FFFFFF"
             Android:textSize="30sp" 
             Android:layout_alignParentLeft="true"
             Android:layout_alignParentTop="true" 
             Android:paddingLeft="4dp"
             Android:paddingTop="4dp" 
             />
    <ImageView
         Android:id="@+id/backImg"
         Android:layout_width="fill_parent"
         Android:layout_height="fill_parent"
         Android:layout_centerInParent="true"
         Android:adjustViewBounds="true"
         Android:background="@color/blancotransless"
         Android:src="@drawable/header"
         Android:scaleType="fitXY" >
     </ImageView>

</LinearLayout> 
1
Zeus Monolitics

Machen Sie einfach einen 9-Pfad-Hintergrund, der dieses Muster wiederholt.

Es scheint auch besser zu sein, wenn das Muster auf die Liste angewendet wird und nicht auf einzelne Elemente.

1
Andrew Matuk

Die einzig akzeptable Antwort sollte hier sein, eine ImageView mit den scaleTypes wie üblich zu verwenden. Hacky arbeitet daran, ein Bild in einer TextView zu skalieren, das nicht von Android unterstützt wird. Es scheint unnötig. Verwenden Sie das SDK wie vorgesehen.

0
mpellegr