2014-09-01 10 views
24

In TextView ho impostato drawableLeft dove il numero drawable viene visualizzato dal centro. Ho bisogno di allineare il drawableLeft con la parte superiore all'interno di TextView come questa immagine.Come allineare DrawableLeft in alto invece al centro in Android TextView?

enter image description here

E 'possibile raggiungere questo obiettivo?

+1

Non semplicemente. Non c'è 'drawableTopLeft'. Quindi, per ottenere ciò che desideri, utilizza un ImageView separato o crea un nuovo controllo che estende TextView. –

+0

utilizza BitmapDrawable.metodo setGravity, assicurati anche che l'altezza dei limiti del drawable sia uguale all'altezza del textview – pskink

+0

@ FrankN.Stein, potresti avere ragione. Potresti per favore dare qualche elaborazione sui controlli personalizzati. – androidcodehunter

risposta

-1

È possibile utilizzare in questo modo. Che possa aiutarti.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="100dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" > 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/imageView1" 
     android:text=" Text Text Text Text Text Text Text Text Text Text Text Text 
     Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text" /> 
</RelativeLayout> 

+0

Non voglio seguire questa strada perché in questo modo dobbiamo usare il layout annidato. – androidcodehunter

+1

Il RelativeLayout esterno è completamente inutile. AND 'fill_parent' è deprecato dal momento che include il livello API 8. Usa 'match_parent', invece –

+0

@androidcodehunter si tratta di layout nidificati o di codice personalizzato, dobbiamo prendere qualche tipo di hit :(Preferisco sempre una soluzione solo XML se è ragionevolmente buona, che è implementata correttamente (puoi risolverlo con un semplice 'LinearLayout' orizzontale.) Tra l'altro non hai nemmeno bisogno di nidificare se usi' ConstraintLayout' o 'RelativeLayout', ma sono ancora 2 viste – TWiStErRob

6

Vedi my answer here.

È possibile allineare un composto-Disegnabile in alto (o in basso) creando un Drawable personalizzato che avvolge il Drawable e quindi manipola il disegno del Drawable personalizzato sovrascrivendo il metodo onDraw(Canvas).

L'esempio seguente è l'esempio più semplice possibile. Questo allinea l'immagine verso l'alto, ma puoi anche farlo allineare in basso, a sinistra oa destra di TextView implementando la logica richiesta nel metodo onDraw(Canvas). Potresti anche voler creare un margine nello onDraw(Canvas), per rendere perfetto il tuo pixel di implementazione della progettazione.

utilizzo Esempio:

GravityCompoundDrawable gravityDrawable = new GravityCompoundDrawable(innerDrawable); 
// NOTE: next 2 lines are important! 
innerDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight()); 
gravityDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight()); 
mTextView.setCompoundDrawables(gravityDrawable, null, null, null); 

codice di esempio:

public class GravityCompoundDrawable extends Drawable { 

    // inner Drawable 
    private final Drawable mDrawable; 

    public GravityCompoundDrawable(Drawable drawable) { 
     mDrawable = drawable; 
    } 

    @Override 
    public int getIntrinsicWidth() { 
     return mDrawable.getIntrinsicWidth(); 
    } 

    @Override 
    public int getIntrinsicHeight() { 
     return mDrawable.getIntrinsicHeight(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     int halfCanvas= canvas.getHeight()/2; 
     int halfDrawable = mDrawable.getIntrinsicHeight()/2; 

     // align to top 
     canvas.save(); 
     canvas.translate(0, -halfCanvas + halfDrawable); 
     mDrawable.draw(canvas); 
     canvas.restore(); 
    } 
} 
+0

come usarlo per allineare il testo e sinistra a sinistra di drawable textview – TheReprator

3

Usa SpannableString e ImageSpan per raggiungere questo obiettivo.

String msg=" "+"haii"; 
ImageSpan mImageSpan== new ImageSpan(mContext, R.drawable.icon); 
SpannableString text = new SpannableString(msg); 
text.setSpan(mImageSpan, 0, 1, 0); 
mTextView.setText(text); 

lo spazio aggiuntivo nella variabile stringa viene sostituito dall'icona.

+1

Bella soluzione, ma sia l'icona che il testo non hanno la stessa gravità. Hai qualche suggerimento? – Khan

1

penso che sia ancora più facile che tutte le risposte di cui sopra: Hai solo bisogno di fare questo:

public class TopGravityDrawable extends BitmapDrawable { 

    public TopGravityDrawable(Resources res, Bitmap bitmap) { 
     super(res, bitmap); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     int halfCanvas = canvas.getHeight()/2; 
     int halfDrawable = getIntrinsicHeight()/2; 
     canvas.save(); 
     canvas.translate(0, -halfCanvas + halfDrawable); 
     super.draw(canvas); 
     canvas.restore(); 
    } 
} 

E poi

final Bitmap bitmap = BitmapFactory.decodeResource(mTitle.getResources(), R.drawable.icon); 
icon = new TopGravityDrawable(mTitle.getResources(), bitmap); 
title.setCompoundDrawablesWithIntrinsicBounds(null, null, null, icon); 

Ricordate questo funziona correttamente solo con SINISTRA e DESTRA composti estraibili

0

si può fare così:

public class DrawableTopLeftTextView extends TextView { 

    public DrawableTopLeftTextView(Context context) { 
     super(context); 
    } 

    public DrawableTopLeftTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public DrawableTopLeftTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     if (!TextUtils.isEmpty(getText())) { 

      Drawable[] drawables = getCompoundDrawables(); 

      if (drawables != null) { 

       Drawable drawableLeft = drawables[0]; 

       if (drawableLeft != null) { 

        Paint.FontMetricsInt fontMetricsInt = getPaint().getFontMetricsInt(); 
        Rect bounds = new Rect(); 
        getPaint().getTextBounds((String) getText(), 0, length(), bounds); 
        int textVerticalSpace = Math.round(bounds.top - fontMetricsInt.top); 
        int offset = (getHeight() - drawableLeft.getIntrinsicHeight())/2 - textVerticalSpace - getPaddingTop()/2; 
        drawableLeft.setBounds(0, -offset, drawableLeft.getIntrinsicWidth(), drawableLeft.getIntrinsicHeight() - offset); 
       } 
      } 
     } 
     super.onDraw(canvas); 
    } 
} 
0

Se si desidera una soluzione puramente XML, è possibile utilizzare un riquadro estraibile per riposizionare il drawable desiderato.

<?xml version="1.0" encoding="utf-8"?> 
<inset 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/actual_image_to_be_shown" 
    android:insetTop="-32dp" /> 

Potrebbe essere necessario giocare con il valore di inserto a seconda del proprio scenario. Quindi basta usare questo XML drawable nella definizione DrawableLeft/Start TextView.

+0

Se hai intenzione di darmi un voto negativo, dimmi almeno perché non ti piace questa soluzione –

+0

Hard i valori codificati non funzionano con il testo dinamico. L'offset negativo dipende da quante righe di testo ci sono + 'fontSize' e altre proprietà di' TextView'. È comunque un buon compromesso per cantare le-line. – TWiStErRob

Problemi correlati