2011-03-30 26 views
40

Tengo la lista con el artículo es un TextView; y utilizando drawableleft & drawableright para asegurar el TextView. el problema es que cada vez que el texto en la vista de texto es más grande, drawableleft & drawableleft no escala automáticamente basándose en la altura TextView.¿Es posible escalar drawableleft & drawableright en textview?

¿Es posible escalar la altura de drawableleft & drawableright en la vista de texto? (que estaba usando la imagen parche 9)

textview drawableleft & drawableright's height problem

+0

uso este enlace: [editar] dibujables compuestos de texto (http://stackoverflow.com/questions/5471026/edittext-with-non-selectable-grayed-out -prefix) –

+0

puede modificar lo siguiente para la vista de texto. También los parámetros para setCompound dibujable tienen opción para dibujar a la derecha, drawable left.void android.widget. Vista de texto.setCompoundDrawables (Drawable left, Drawable top, Drawable right, Drawable bottom) –

+0

gracias :) pero no funciona, la imagen aún no se puede estirar. Intento establecer el límite dibujable utilizando la altura de vista de texto (textview.getHeight()), pero devuelve la altura de diseño de vista de texto no la altura actual. – hakim

Respuesta

1

no me encontré camino. Pero que muestres parece una lista de elementos. Cada elemento sería una horizontal LinearLayout con imagesView de izquierda a derecha y texto en el centro. La dimensión de la imagen hace un android: scaleType = "fitXY" para ajustar la altura del tamaño a la altura de la vista de texto. Si no desea deformar la imagen, use 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> 
+0

Utilicé esta solución con éxito porque no pude escalar dibujables izquierda/derecha ya que la pregunta sugiere – Elemental

1

Simplemente haga fondo 9-camino de repetir este patrón.

Y también parece que será mejor mirar en caso de que el patrón se aplicará a la lista, no a un elemento individual.

7

He resuelto un caso de uso equivalente al introducir un ScaleDrawable y anulando su .getIntrisicHeight() de modo que sea al menos la altura TextView. La parte TextView.addOnLayoutChangeListener, necesario para volver a vincular el Drawable en un cambio de tamaño TextView trabaja con 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); 
    } 
}); 
+0

Gran respuesta, buen formato de código. –

-1

favor tiene un intento de este código. Esto puede ayudarte.

Drawable TextViewDrawable = context.getResources().getDrawable(imageId); 
      TextViewDrawable.setBounds(0, 0, TextViewDrawable.getIntrinsicWidth(), 
        TextViewDrawable.getIntrinsicHeight()); 
      text_view.setCompoundDrawables(left, top, right, bottom); 
+4

esto ni siquiera compilará ... – katzenhut

+0

no, no funciona. –

12

Esto podría ayudarlo. Hay dos propiedades scaleX scaleY y

El código siguiente se ralentizará la imagen y el texto con el 30%. Por lo tanto, tiene que aumentar el tamaño de fuente con tantas "sp", para que cuando se vuelva a clasificar según el tamaño (escala) se ajuste a la "sp" que prefiera.

Ejemplo. Si fijo el tipo de letra a 18, entonces 30% de 18 es 5.4sp, por lo menos, este es el valor que estoy apuntando a, porque cuando se escala, se convertiría en 13sp

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

Lo último hacer es establecer el CompundDrawable.

tview.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.xxx), null, null, null); 
+0

gracias, funciona genial :) – iBabur

+1

Estoy seguro de que no es el más elegante, pero he intentado muchas cosas y se estaba volviendo demasiado complejo para hacer una pregunta tan fácil. ¡Gracias! – Lancelot

+0

solución inteligente, fácil de implementar –

0

Esperanza esta ayuda

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 
); 
Cuestiones relacionadas