Adatta immagine a ImageButton in Android


147

Ho 6 ImageButton nella mia attività, ho impostato le immagini attraverso il mio codice (non usando XML).

Voglio che coprano il 75% dell'area dei pulsanti. Ma dove alcune immagini coprono meno area, alcune sono troppo grandi per adattarsi al pulsante Immagine. Come ridimensionarli e mostrarli a livello di programmazione? Di seguito è la schermata

inserisci qui la descrizione dell'immagine sotto è il file 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 uno snippet di 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);      
    }

2
hai controllato i metodi di ridimensionamento forniti da Android? developer.android.com/reference/android/widget/…
bofredo,

Risposte:


393

Voglio che coprano il 75% dell'area dei pulsanti.

Utilizzare android:padding="20dp"(regolare l'imbottitura in base alle esigenze) per controllare la quantità di immagine occupata dal pulsante.

ma dove alcune immagini coprono meno area, alcune sono troppo grandi per adattarsi al pulsante image. Come ridimensionarli e mostrarli a livello di programmazione?

Utilizzare a android:scaleType="fitCenter"per fare in modo che Android ridimensioni le immagini e android:adjustViewBounds="true"che modifichino i limiti a causa del ridimensionamento.

Tutti questi attributi possono essere impostati in codice su ciascuno ImageButtonin fase di esecuzione. Tuttavia, secondo me è molto più semplice impostare e visualizzare l'anteprima in XML.

Inoltre, non utilizzare spnulla di diverso dalla dimensione del testo, viene ridimensionato in base alla preferenza della dimensione del testo impostata dall'utente, quindi le spdimensioni saranno maggiori di quelle previste se l'utente ha un'impostazione di testo "grande". Utilizzare dpinvece, poiché non è ridimensionato dalla preferenza della dimensione del testo dell'utente.

Ecco un frammento di come dovrebbe apparire ogni pulsante:

    <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" />

Pulsante di esempio


@Steven Byle Ci scusiamo per la risposta tardiva, ma come posso applicare lo stesso ma per un layout relativo?
Siamo tutti matti qui il

8
Per coloro che cercano, i ImageButtonmetodi lo setScaleType(ImageView.ScaleType.CENTER) setAdjustViewBounds(true)fanno a livello di codice.
ps95,

Grazie mille :)
Pankaj Nimgade,

1
Fai anche android: background = "@ null" per provare lo sfondo predefinito
C.Ikongo

31

Sto usando il seguente codice in xml

android:adjustViewBounds="true"
android:scaleType="centerInside"

2
Ho un rettangolo piuttosto "piatto" e questo funziona bene per me ... un problema però: assicurati di usare "android: src" invece di "android: background". +1.
Johnny Wu,

@johnny Grazie amico per l'informazione!
Bishan,

8

Prova a utilizzare android:scaleType="fitXY"in i-Imagebutton xml


anche se questo ha funzionato e ridimensionato, ma volevo che coprisse il 75% dell'area per una migliore visibilità.
RDX,

@PowerPC prova a usare framelayout per dare altezza e larghezza al 75% e nel layout di quel frame usa il tuo pulsante immagine e imposta il tipo di scala in modo da adattarlo a xy
Swap-IOS-Android

framelayout per ogni pulsante immagine all'interno di linearlayout? puoi chiarire
RDX

@PowerPC Non lo uso mai, ma questo link può aiutarti a stackoverflow.com/questions/9946580/…
Swap-IOS-Android

1
@StevenByle Ho considerato entrambi gli approcci, ma poiché volevo una copertura dell'area del 75%, la tua soluzione ha funzionato bene. Grazie.
RDX,


3

Fai riferimento al link seguente e prova a trovare ciò che desideri davvero:

ImageView.ScaleType CENTER Centra l'immagine nella vista, ma non esegue il ridimensionamento.

ImageView.ScaleType CENTER_CROP Ridimensiona l'immagine in modo uniforme (mantiene le proporzioni dell'immagine) in modo che entrambe le dimensioni (larghezza e altezza) dell'immagine siano uguali o maggiori della dimensione corrispondente della vista (meno riempimento).

ImageView.ScaleType CENTER_INSIDE Ridimensiona l'immagine in modo uniforme (mantiene le proporzioni dell'immagine) in modo che entrambe le dimensioni (larghezza e altezza) dell'immagine siano uguali o inferiori alla dimensione corrispondente della vista (meno riempimento).

ImageView.ScaleType FIT_CENTER Ridimensiona l'immagine usando CENTER.

ImageView.ScaleType FIT_END Ridimensiona l'immagine usando END.

ImageView.ScaleType FIT_START Ridimensiona l'immagine usando START.

ImageView.ScaleType FIT_XY Ridimensiona l'immagine usando FILL.

ImageView.ScaleType MATRIX Scala utilizzando la matrice di immagini durante il disegno.

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


1

Di recente ho scoperto per caso che, poiché hai un maggiore controllo su ImageView, puoi impostare un listener onclick per un'immagine qui è un esempio di un pulsante immagine creato 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
                }
            });

Non è una cattiva idea. Mi piace.
Boris Karloff,

0

Ha funzionato bene nel mio caso. Innanzitutto, scarichi un'immagine e la rinomini come iconimage, la localizza nella cartella disegnabile. È possibile modificare le dimensioni impostando android:layout_widtho android:layout_height. Finalmente abbiamo

 <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" />

0

Puoi creare il tuo widget ImageButton come ho fatto io. Nel mio caso, avevo bisogno di un widget con una dimensione dell'icona fissa. Partiamo da attributi personalizzati:

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

La classe Widget è abbastanza semplice (il punto chiave sono i calcoli di riempimento nel metodo 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 dovresti usare il tuo widget in questo modo:

<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"
    />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.