2012-02-06 11 views
20

Android-Lint mi dà questo suggerimento in alcuni casi:dimensioni CompoundDrawable

Questo tag ed i suoi figli possono essere sostituiti da uno e un composto drawable

ho potuto farlo in alcuni luoghi , ma in altri posti in cui l'immagine è importante per ridimensionare l'immagine non sono in grado di farlo. C'è qualche opzione che posso impostare la dimensione di un composto estraibile?

+0

Avrai bisogno di inviare un esempio di cosa stai parlando? Cosa intendi per "composto estraibile"? –

risposta

19

Se si ridimensionano le immagini nel codice come oggetti disegnabili, è possibile impostarli in codice utilizzando il metodo setCompoundDrawables() di TextView. Ciò richiederà aver chiamato setBounds() sui Drawables.

Per quanto ne so non c'è modo di impostare la dimensione in XML.

+3

grazie per la risposta anche se non mi piace il fatto che non è possibile farlo in XML e scegliere tra 2 soluzioni subottimali (attenzione a non usare il layout e il codice mescolabili e mescolabili) – ligi

+0

@ligi Puoi farlo con la semplice visualizzazione personalizzata, vedere la mia risposta - http://stackoverflow.com/a/31916731/2308720 – Oleksandr

1

So che questa risposta è un po 'in ritardo, ma mi consiglia di utilizzare l'quickfix: "Aggiungi ignorare 'UseCompoundDrawables' a elemento"

Questo si tradurrà in qualcosa di simile:

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    tools:ignore="UseCompoundDrawables" > <!-- This will remove the warning --> 

    <ImageView 
     android:layout_width="@dimen/icon_width" 
     android:layout_height="@dimen/icon_height" 
     android:contentDescription="@string/item1" 
     android:src="@drawable/icon1" /> 

    <TextView 
     android:text="@string/item1" 
     android:textSize="@dimen/label_font_size" /> 
</LinearLayout> 

Usa con attenzione e lascia sperare che l'API o gli strumenti vengano "riparati" presto.

+2

Per aggiungere a questo vale la pena menzionare lo spazio dei nomi xml per questo è: 'xmlns: tools =" http: // schemi. android.com/tools "' – Malachi

+2

Ma questo è contro l'efficienza! Android ti avvisa per qualcosa! Gonfiare un layout lineare e un ImageView e un TextView è completamente evitabile se si usa un CompoundDrawable come suggerito –

+2

@joaquin Il punto è che non è possibile ottenere un compounddrawable che assomigli esattamente a quello che avrebbe in un layout lineare con un'altezza specificata/larghezza o ridimensionamento ecc. ora. Ci sono alcune soluzioni proposte sopra, ma realisticamente queste aggiungono complessità non necessaria/indiretta e sono meno efficienti rispetto all'utilizzo di un layout lineare. – RyPope

5

C'è una soluzione, ma non è al 100% soddisfacente dal momento che non è possibile controllare la dimensione direttamente soltanto l'imbottitura relativa con inset:

background.xml

<?xml version="1.0" encoding="utf-8"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
     android:insetBottom="4dp" 
     android:insetTop="4dp" 
     android:insetLeft="4dp" 
     android:insetRight="4dp"> 
    <bitmap android:src="@drawable/your_icon"/> 
</inset> 

layout.xml

<TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Your text" 
     android:drawableLeft="@drawable/background" 
     android:drawablePadding="8dp" 
     /> 

Un'altra soluzione sarebbe ScaleDrawables, ma immagino che questo non funzionerà molto su diverse densità di pixel.

+0

Inset funziona molto bene in KitKat, ma non funziona in Marsmallow. Qualche idea del perché? – Sam

21

ho finalmente rilasciato una libreria per esso:

https://github.com/a-tolstykh/textview-rich-drawable

usare questa libreria per impostare le dimensioni drawable composto.

risposta originale

È possibile aggiungere attributo personalizzato per l'immagine per lavorare con dimensioni di drawable. Certo, questa soluzione richiede un codice aggiuntivo, ma solo una volta! Dopo puoi risolvere il problema usando solo xml (solo una volta cambia il controllo e usalo in tutto il progetto).

Vedi il mio esempio:

TextViewDrawableSize.java

 
public class TextViewDrawableSize extends TextView { 

    private int mDrawableWidth; 
    private int mDrawableHeight; 

    public TextViewDrawableSize(Context context) { 
     super(context); 
     init(context, null, 0, 0); 
    } 

    public TextViewDrawableSize(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs, 0, 0); 
    } 

    public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context, attrs, defStyleAttr, 0); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public TextViewDrawableSize(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(context, attrs, defStyleAttr, defStyleRes); 
    } 

    private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TextViewDrawableSize, defStyleAttr, defStyleRes); 

     try { 
      mDrawableWidth = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableWidth, -1); 
      mDrawableHeight = array.getDimensionPixelSize(R.styleable.TextViewDrawableSize_compoundDrawableHeight, -1); 
     } finally { 
      array.recycle(); 
     } 

     if (mDrawableWidth > 0 || mDrawableHeight > 0) { 
      initCompoundDrawableSize(); 
     } 
    } 

    private void initCompoundDrawableSize() { 
     Drawable[] drawables = getCompoundDrawables(); 
     for (Drawable drawable : drawables) { 
      if (drawable == null) { 
       continue; 
      } 

      Rect realBounds = drawable.getBounds(); 
      float scaleFactor = realBounds.height()/(float) realBounds.width(); 

      float drawableWidth = realBounds.width(); 
      float drawableHeight = realBounds.height(); 

      if (mDrawableWidth > 0) { 
       // save scale factor of image 
       if (drawableWidth > mDrawableWidth) { 
        drawableWidth = mDrawableWidth; 
        drawableHeight = drawableWidth * scaleFactor; 
       } 
      } 
      if (mDrawableHeight > 0) { 
       // save scale factor of image 

       if (drawableHeight > mDrawableHeight) { 
        drawableHeight = mDrawableHeight; 
        drawableWidth = drawableHeight/scaleFactor; 
       } 
      } 

      realBounds.right = realBounds.left + Math.round(drawableWidth); 
      realBounds.bottom = realBounds.top + Math.round(drawableHeight); 

      drawable.setBounds(realBounds); 
     } 
     setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]); 
    } 
}

attrs.xml

<resources> 
    <declare-styleable name="TextViewDrawableSize"> 
     <attr name="compoundDrawableWidth" format="dimension"/> 
     <attr name="compoundDrawableHeight" format="dimension"/> 
    </declare-styleable> 
</resources> 

e l'uso di

<com.alt.view.TextViewDrawableSize 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:drawableLeft="@drawable/logo" 
     android:drawableStart="@drawable/logo" 
     android:drawablePadding="@dimen/space_micro" 
     app:compoundDrawableHeight="@dimen/small_logo_height" 
     app:compoundDrawableWidth="@dimen/small_logo_width" 
     /> 
+1

Fantastico! L'ho fatto in base al codice https://gist.github.com/hrules6872/578b52fe90c30c7445a2 grazie :) – hrules6872

+0

@h_rules Siete i benvenuti – Oleksandr

+0

Questo è fantastico, grazie! –