Domanda

Ho un tasto. Il pulsante è costruito dal StateListDrawable (fatta di 3 immagini 9-patch). Ho bisogno di aggiungere un ulteriore drawable che risiederà sul lato destro del pulsante, e ho bisogno di essere allineato con il lato destro del pulsante. Ho cercato di utilizzare il seguente:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/blue_back_button_drawable" />
    <item>
      <bitmap android:src="@drawable/filter_by_button_v_mark" android:gravity="right"/>
    </item>
</layer-list>

non ha funzionato e l'immagine V è infatti allineato a destra, ma ha un diff dal lato destro del pulsante. Ecco un'istantanea: alt text

Voglio l'immagine da essere allineato con sinistra del pulsante, l'unico modo in questo momento penso di poter farlo è:

  1. set di pulsanti Eredita, nel onLayout DOPO la larghezza è stato ottenere il bordo destro.
  2. ottenere drawable sfondo (layerDrawable)
  3. calc la larghezza del pulsante meno la larghezza v immagine e impostarla come margine sinistro nel drawable.

Non dovrei parlare di questo suoni orribili :-) ho sperato che c'è un modo migliore. Oh, la ragione non è parte dell'immagine è che ho bisogno di sapere che è larghezza in modo che io possa calc l'imbottitura testo in modo che non sarà nascosta da un testo del pulsante e perché non è così bello guardare come un 9-patch.

È stato utile?

Soluzione

Sembra che non c'era una soluzione adeguata a questo. strato è statica e non immagini 9-toppa apparentemente, o così sembra. Così ho esteso Button, cambiato è il Draw, devo usare Canvas.restore () per uscire dai margini che hanno spinto i miei bordi verso il basso e mettere la mia immagine nell'angolo in alto a destra ... ecco il codice:

 @Override
public void setPadding(int left, int top, int right, int bottom) {
    right += mImageWidth;
    super.setPadding(left, top, right, bottom);
}

private void setVImageDrawable(Drawable d) {
    mVImageDrawable = d;
    mImageWidth = mVImageDrawable.getIntrinsicWidth();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if( mVImageDrawable != null && mIsMarked){
        //for some reason the clip binds us to position with margins, which is not so good for us.
        //we need to save the clip, restore the canvas to pre clipping mode, do what we need then
        //put the canvas back to it's previous clipping state.
        Rect bounds = canvas.getClipBounds();
        canvas.restore();
        int right = getRight();
        int left = right - mImageWidth;
        int top = getTop();
        int bottom = top + mVImageDrawable.getIntrinsicHeight();
        mVImageDrawable.setBounds(left, top, right, bottom);
        mVImageDrawable.draw(canvas);
        canvas.save();
        canvas.clipRect(bounds);
    }
}

Se non mi scoppiare la tela iget originale 'spinto verso il basso' con qualsiasi margine aggiungo, può anche essere fissato penso utilizzando la proprietà XML che specifica se i bambini devono essere tagliate sul layout che contiene questo pulsante, ma io scoprire che la soluzione zoppa in quanto rende il mio tasto dipende da nostre condizioni. L'immagine stessa che ricevo da XML utilizzando nuovi attributi e lo stile e il tema dichiaro.

La speranza che ti aiuto alcuni ppl là fuori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top