Pergunta

Eu tenho um botão. O botão é construído a partir do Statelistdrawable (feito de 3 imagens de 9 patch). Preciso adicionar um desenho extra que residirá no lado direito do botão e preciso que ele esteja alinhado com o lado direito do botão. Eu tentei usar o seguinte:

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

Não funcionou e a imagem V está realmente alinhada, mas é um diferencial do lado direito do botão. Aqui está um instantâneo: alt text

Quero que a imagem esteja alinhada com a esquerda do botão, a única maneira agora acho que posso fazer isso:

  1. O botão Herite, no Onlayout, após a largura ter sido definida, obtenha a borda correta.
  2. Obtenha o fundo desenhado (LayerDrawable)
  3. Calcule a largura do botão menos a largura da imagem V e defina -a como margem esquerda no desenhado.

Eu não devo mencionar que isso parece horrível :-) Eu esperava que houvesse uma maneira melhor. Ah, a razão pela qual não faz parte da imagem é que eu preciso saber que é de largura para que eu possa calcular o preenchimento de texto para que não fique oculto pelo texto do botão e porque não é tão bonito como um patch.

Foi útil?

Solução

Parece que não havia solução adequada para isso. A camada é para imagens estáticas e não de 9 patch, aparentemente, ou assim parece. Então, estendi o botão, alterado, está em sorte, eu tenho que usar canvas.restore () para sair das margens que empurraram minhas bordas e colocar minha imagem no canto superior direito ... aqui está o 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);
    }
}

Se eu não quebrar a tela original 'empurrada' por qualquer margem que eu acrescento, também pode ser consertado, acho que usando a propriedade XML que especifica se as crianças devem ser cortadas no layout que contém esse botão, mas acho que manco Solução, pois torna meu botão dependente de nossas condições. A imagem em si recebo do XML usando novos atributos, estilo e tema que declaro.

Espero que ajude algumas pessoas por aí.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top