Pregunta

Tengo un botón. El botón se construye a partir del StateListDrawable (hecho de 3 imágenes 9-patch). Tengo que añadir un extra de dibujable que residirá en el lado derecho del botón, y lo necesito para estar alineado con el lado derecho del botón. He intentado utilizar la siguiente:

<?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>

no funcionó y la imagen V es, en efecto alineado a la derecha, pero tiene un diff desde el lado derecho del botón. He aquí una instantánea: texto alternativo ??

Quiero que la imagen se alinea con la izquierda del botón, la única manera en este momento creo que puedo hacerlo es:

  1. conjunto de botones de heredar, en OnLayout DESPUÉS el ancho ha sido conseguir el borde derecho.
  2. obtener la dibujable fondo (layerDrawable)
  3. Calc ancho del botón menos el ancho v imagen y configurarla como margen izquierdo en el dibujable.

No debería mencionar esto suena horrible :-) Yo esperaba que hay una manera mejor. Oh, la razón por la que no es parte de la imagen es lo que necesito para saber que es ancho para que pueda calc el relleno de texto de modo que no será ocultado por el texto del botón y debido a que no es tan bonito como 9-parche.

¿Fue útil?

Solución

Parece que no existe una solución adecuada a este. capa es de estática y no imágenes 9-patch parecer, o eso parece. Así que me ampliado Button, que es cambiado en Draw, tengo que utilizar Canvas.restore () para salir de los márgenes que empujaron mis bordes hacia abajo y poner mi imagen en la esquina superior derecha ... Aquí está el código:

 @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);
    }
}

Si no rompo el iget tela original 'empujado hacia abajo' por los márgenes añado, también puede fijarse creo que el uso de la propiedad XML que especifica si los niños se debe cortar en la disposición que contiene este botón, pero yo encontrar esa solución cojos ya que hace dependiente de mi botón en nuestras condiciones. La imagen de sí mismo que recibo de XML con nuevos atributos y estilo y el tema DECLARO.

La esperanza que va a ayudar algunos PPL por ahí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top