web-dev-qa-db-fra.com

Est-il possible de redimensionner drawableleft & drawableright dans textview?

J'ai la liste avec l'article est une TextView; et en utilisant drawableleft & drawableright pour indiquer la valeur TextView. le problème est que, chaque fois que le texte dans textview est plus volumineux, drawableleft & drawableleft n'augmente pas automatiquement en fonction de la hauteur de TextView.

Est-il possible de redimensionner la hauteur drawableleft & drawableeright dans textview? (J'utilisais une image de 9 patch)

textview drawableleft & drawableright's height problem

47
hakim

Cela pourrait vous aider. Il y a deux propriétés scaleX et scaleY  

Le code ci-dessous réduira l'image et le texte à 30%. Par conséquent, vous devez augmenter la taille de la police avec autant de "sp", de sorte que, si elle est redimensionnée (redimensionnée), elle s'adapte au "sp" que vous préférez.

Exemple. Si je règle la police à 18, alors 30% sur 18 est de 5,4 ps, donc, en gros, il s’agit de la valeur que je cible, car lorsqu’elle est redimensionnée, elle devient 13sp.

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

La dernière chose à faire est de définir CompundDrawable.

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

J'ai résolu un cas d'utilisation équivalent en introduisant une ScaleDrawable et en remplaçant sa .getIntrisicHeight() afin qu'elle ait au moins la hauteur TextView La partie TextView.addOnLayoutChangeListener, requise pour relier la Drawable à un changement de taille TextView fonctionne avec 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

J'espère que cette aide

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

Je n'ai pas trouvé le chemin. Mais que vous montriez ressemble à une liste d’articles. Chaque élément serait un horizontal LinearLayout avec imagesVue de gauche à droite et le texte au centre. La dimension de l'image utilise Android: scaleType = "fitXY" pour ajuster la hauteur de la taille à la hauteur de la vue du texte . Si vous ne souhaitez pas déformer l'image, utilisez 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

Il suffit de créer un arrière-plan de 9 chemins en répétant ce motif.

Et aussi, il semble préférable de regarder au cas où le motif serait appliqué à la liste, pas à un élément individuel.

1
Andrew Matuk

La seule réponse acceptable ici devrait être d'utiliser un ImageView avec les scaleTypes comme d'habitude. Des solutions astucieuses pour redimensionner une image sur un TextView non pris en charge par Android semblent .. inutiles. Utilisez le SDK comme prévu.

0
mpellegr