Ajustar imagem no ImageButton no Android

147

Eu tenho 6 ImageButton em minha atividade, defino imagens através do meu código nelas (não usando xml).

Quero que eles cubram 75% da área dos botões. Mas onde algumas imagens cobrem menos área, outras são grandes demais para caber no botão image. Como redimensionar programaticamente e mostrá-los? Abaixo está a captura de tela

insira a descrição da imagem aqui abaixo está o arquivo xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_marginBottom="5sp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"     >
   <LinearLayout
        android:layout_height="0dp"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal">
        <ImageButton          

            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:id="@+id/button_topleft"
        android:layout_marginBottom="5sp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"
            />
        <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:id="@+id/button_topright"
    android:layout_marginBottom="5sp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_height="0dp"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal">

        <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:id="@+id/button_repeat"
    android:layout_marginBottom="5sp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"     
             />

              <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:id="@+id/button_next"
    android:layout_marginBottom="5sp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"     
             />

    </LinearLayout>    
   <LinearLayout
        android:layout_height="0dp"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal">

        <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:id="@+id/button_bottomleft"
    android:layout_marginBottom="5sp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"                                 
             />
        <ImageButton
            android:layout_height="match_parent"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:id="@+id/button_bottomright"
    android:layout_marginBottom="5sp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="5sp"
        android:layout_marginTop="0sp"                  
            />        
    </LinearLayout>        

</LinearLayout>

e um trecho de myClass.java:

public void addImageButtons()
    {
        iB_topleft = (ImageButton) findViewById(R.id.button_topleft);
        iB_topright = (ImageButton) findViewById(R.id.button_topright);
        iB_bottomleft = (ImageButton) findViewById(R.id.button_bottomleft);
        iB_bottomright = (ImageButton) findViewById(R.id.button_bottomright);
        iB_next = (ImageButton) findViewById(R.id.button_next);
        iB_repeat = (ImageButton) findViewById(R.id.button_repeat);
    }

    public void setImageNextAndRepeat()
    {

    iB_topleft .setImageResource(R.drawable.aa);
        iB_topright.setImageResource(R.drawable.bb);   

    iB_bottomleft.setImageResource(R.drawable.cc);
        iB_bottomright.setImageResource(R.drawable.dd);   

        iB_next.setImageResource(R.drawable.next);
        iB_repeat.setImageResource(R.drawable.repeat);      
    }
RDX
fonte
2
você verificou os métodos de dimensionamento que o android fornece? developer.android.com/reference/android/widget/…
bofredo 27/02

Respostas:

393

Quero que eles cubram 75% da área dos botões.

Use android:padding="20dp"(ajuste o preenchimento conforme necessário) para controlar o quanto a imagem ocupa no botão.

mas onde algumas imagens cobrem menos área, outras são grandes demais para caber no botão image. Como redimensionar programaticamente e mostrá-los?

Use a android:scaleType="fitCenter"para que o Android dimensione as imagens e faça android:adjustViewBounds="true"com que elas ajustem seus limites devido ao dimensionamento.

Todos esses atributos podem ser definidos no código em cada um ImageButtonem tempo de execução. No entanto, é muito mais fácil definir e visualizar em xml na minha opinião.

Além disso, não use sppara nada que não seja o tamanho do texto, pois ele é redimensionado dependendo da preferência de tamanho do texto que o usuário definir, para que suas spdimensões sejam maiores que as pretendidas se o usuário tiver uma configuração de texto "grande". Use em dpvez disso, pois não é dimensionado pela preferência do tamanho do texto do usuário.

Aqui está um trecho da aparência de cada botão:

    <ImageButton
        android:id="@+id/button_topleft"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="2dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="0dp"
        android:layout_weight="1"
        android:adjustViewBounds="true"
        android:padding="20dp"
        android:scaleType="fitCenter" />

Botão de amostra

Steven Byle
fonte
@ Steven Byle Desculpe pela resposta tardia, mas como posso aplicar o mesmo, mas para um layout relativo?
Estamos todos loucos aqui
8
Para aqueles que procuram, os ImageButtonmétodos setScaleType(ImageView.ScaleType.CENTER) setAdjustViewBounds(true)fazem isso programaticamente.
Ps95
Muito obrigado :)
Pankaj Nimgade
1
Também fazer android: background = "@ nulo" para tentar o fundo padrão
C.Ikongo
31

Estou usando o seguinte código em xml

android:adjustViewBounds="true"
android:scaleType="centerInside"
Pratibha Sarode
fonte
2
Eu tenho um retângulo bastante "plano" e isso funciona bem para mim ... um problema: certifique-se de usar "android: src" em vez de "android: background". +1.
Johnny Wu
@johnny Obrigado companheiro pela dica!
Bishan
8

Tente usar android:scaleType="fitXY"no i-Imagebutton xml

Swap-IOS-Android
fonte
embora isso tenha funcionado e escalado, mas eu queria que ele cobrisse 75% da área para melhor visibilidade.
RDX
@PowerPC tentar usar FrameLayout dar heigh e largura para 75% e em que quadro layout usar seu imagebutton e conjunto de escala do tipo apto para xy
Swap-IOS-Android
layout de quadro para cada botão de imagem dentro do layout linear? u pode plz esclarecer
RDX
@PowerPC Eu nunca uso isso, mas esse link pode ajudá-lo a stackoverflow.com/questions/9946580/…
Swap-IOS-Android
1
@StevenByle Eu considerei as duas abordagens, mas como eu queria uma cobertura de área de 75%, sua solução funcionou bem. Obrigado.
RDX
7

Estou usando android:scaleType="fitCenter"com satisfação.

Serafim
fonte
3

Consulte o link abaixo e tente encontrar o que você realmente deseja:

ImageView.ScaleType CENTER Centraliza a imagem na exibição, mas não executa redimensionamento.

ImageView.ScaleType CENTER_CROP Dimensione a imagem uniformemente (mantenha a proporção da imagem) para que ambas as dimensões (largura e altura) da imagem sejam iguais ou maiores que a dimensão correspondente da vista (menos preenchimento).

ImageView.ScaleType CENTER_INSIDE Dimensione a imagem uniformemente (mantenha a proporção da imagem) para que ambas as dimensões (largura e altura) da imagem sejam iguais ou menores que a dimensão correspondente da vista (menos preenchimento).

ImageView.ScaleType FIT_CENTER Dimensione a imagem usando CENTER.

ImageView.ScaleType FIT_END Dimensione a imagem usando END.

ImageView.ScaleType FIT_START Dimensione a imagem usando START.

ImageView.ScaleType FIT_XY Dimensione a imagem usando FILL.

ImageView.ScaleType MATRIX Dimensione usando a matriz da imagem ao desenhar.

https://developer.android.com/reference/android/widget/ImageView.ScaleType.html

Nhat Dinh
fonte
1

Recentemente, descobri por acidente que, como você tem mais controle sobre um ImageView, pode definir um onclicklistener para uma imagem. Aqui está uma amostra de um botão de imagem criado dinamicamente

private int id;
private bitmap bmp;
    LinearLayout.LayoutParams familyimagelayout = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT );

    final ImageView familyimage = new ImageView(this);
            familyimage.setBackground(null);
            familyimage.setImageBitmap(bmp);
            familyimage.setScaleType(ImageView.ScaleType.FIT_START);
            familyimage.setAdjustViewBounds(true);
            familyimage.setId(id);
            familyimage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //what you want to do put here
                }
            });
David
fonte
Não é uma má ideia. Eu gosto.
Boris Karloff #
0

Funcionou bem no meu caso. Primeiro, você baixa uma imagem e a renomeia como iconimage, localiza-a na pasta drawable. Você pode alterar o tamanho configurando android:layout_widthou android:layout_height. Finalmente, temos

 <ImageButton
        android:id="@+id/answercall"
        android:layout_width="120dp"
        android:layout_height="80dp"
        android:src="@drawable/iconimage"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:scaleType="fitCenter" />
Jame
fonte
0

Você pode criar seu widget ImageButton como eu fiz. No meu caso, eu precisava de um widget com um tamanho fixo de ícone. Vamos começar pelos atributos personalizados:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ImageButtonFixedIconSize">
        <attr name="imageButton_icon" format="reference" />
        <attr name="imageButton_iconWidth" format="dimension" />
        <attr name="imageButton_iconHeight" format="dimension" />
    </declare-styleable>
</resources>

A classe Widget é bastante simples (o ponto principal é preencher os cálculos no método onLayout ):

class ImageButtonFixedIconSize
@JvmOverloads
constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = android.R.attr.imageButtonStyle
) : ImageButton(context, attrs, defStyleAttr) {

    private lateinit var icon: Drawable

    @Px
    private var iconWidth: Int = 0
    @Px
    private var iconHeight: Int = 0

    init {
        scaleType = ScaleType.FIT_XY
        attrs?.let { retrieveAttributes(it) }
    }

    /**
     *
     */
    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        val width = right - left
        val height = bottom - top

        val horizontalPadding = if(width > iconWidth) (width - iconWidth) / 2 else 0
        val verticalPadding = if(height > iconHeight) (height - iconHeight) / 2 else 0

        setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding)

        setImageDrawable(icon)

        super.onLayout(changed, left, top, right, bottom)
    }

    /**
     *
     */
    private fun retrieveAttributes(attrs: AttributeSet) {
        val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ImageButtonFixedIconSize)

        icon = typedArray.getDrawable(R.styleable.ImageButtonFixedIconSize_imageButton_icon)!!

        iconWidth = typedArray.getDimension(R.styleable.ImageButtonFixedIconSize_imageButton_iconWidth, 0f).toInt()
        iconHeight = typedArray.getDimension(R.styleable.ImageButtonFixedIconSize_imageButton_iconHeight, 0f).toInt()

        typedArray.recycle()
    }
}

E, finalmente, você deve usar seu widget assim:

<com.syleiman.gingermoney.ui.common.controls.ImageButtonFixedIconSize
    android:layout_width="90dp"
    android:layout_height="63dp"

    app:imageButton_icon="@drawable/ic_backspace"
    app:imageButton_iconWidth="20dp"
    app:imageButton_iconHeight="15dp"

    android:id="@+id/backspaceButton"
    tools:ignore="ContentDescription"
    />
Alex Shevelev
fonte