Dopasuj obraz do ImageButton w systemie Android

147

W swojej działalności mam 6 ImageButton, ustawiam w nich obrazy poprzez mój kod (nie używając XML).

Chcę, aby obejmowały 75% obszaru przycisku. Ale jeśli niektóre obrazy zajmują mniejszy obszar, niektóre są zbyt duże, aby zmieścić się w imageButton. Jak programowo zmienić rozmiar i wyświetlić je? Poniżej znajduje się zrzut ekranu

wprowadź opis obrazu tutaj poniżej znajduje się plik 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>

i fragment 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
źródło
2
sprawdziłeś metody skalowania, które zapewnia Android? developer.android.com/reference/android/widget/…
bofredo

Odpowiedzi:

393

Chcę, aby obejmowały 75% obszaru przycisku.

Użyj android:padding="20dp"(dostosuj wypełnienie w razie potrzeby), aby kontrolować, ile obrazu zajmuje na przycisku.

ale jeśli niektóre obrazy zajmują mniejszy obszar, niektóre są zbyt duże, aby zmieścić się w imageButton. Jak programowo zmienić rozmiar i wyświetlić je?

Użyj a, android:scaleType="fitCenter"aby system Android skalował obrazy i android:adjustViewBounds="true"dostosował ich granice ze względu na skalowanie.

Wszystkie te atrybuty można ustawić w kodzie każdego z nich ImageButtonw czasie wykonywania. Jednak moim zdaniem znacznie łatwiej jest ustawić i wyświetlić podgląd w xml.

Ponadto, nie należy używać spdo innych celów niż rozmiar tekstu, jest skalowana w zależności od preferencji rozmiar tekstu zestawy użytkownika, dzięki czemu spwymiary będą większe niż zamierzone, jeśli użytkownik ma „duże” ustawienie tekstu. Użyj dpzamiast tego, ponieważ nie jest skalowany według preferencji rozmiaru tekstu użytkownika.

Oto fragment tego, jak powinien wyglądać każdy przycisk:

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

Przykładowy przycisk

Steven Byle
źródło
@Steven Byle Przepraszam za późną odpowiedź, ale jak mogę zastosować to samo, jeśli nie ma względnego układu?
Wszyscy jesteśmy
8
Dla tych, którzy szukają, ImageButtonmetody setScaleType(ImageView.ScaleType.CENTER) setAdjustViewBounds(true)robią to programowo.
ps95
Dziękuję bardzo :)
Pankaj Nimgade
1
Zrób także android: background = "@ null", aby wypróbować domyślne tło
C.Ikongo
31

Używam następującego kodu w xml

android:adjustViewBounds="true"
android:scaleType="centerInside"
Pratibha Sarode
źródło
2
Mam raczej „płaski” prostokąt i to działa dobrze dla mnie… jeden haczyk: upewnij się, że używasz „android: src” zamiast „android: background”. +1.
Johnny Wu,
@johnny Dzięki kolego za cynk!
Bishan
8

Spróbuj użyć android:scaleType="fitXY"w i-Imagebutton xml

Swap-IOS-Android
źródło
chociaż to działało i skalowane, ale chciałem, aby obejmowało 75% obszaru dla lepszej widoczności.
RDX,
@PowerPC spróbuj użyć framelayout, podaj wysokość i szerokość do 75%, a do tego układu ramek użyj przycisku obrazu i ustaw typ skali dopasowany do xy
Swap-IOS-Android
framelayout dla każdego imagebutton wewnątrz linearlayout? can u plz clarify
RDX
@PowerPC Nigdy tego nie używam, ale ten link może pomóc ci stackoverflow.com/questions/9946580/ ...
Swap-IOS-Android
1
@StevenByle Rozważałem oba podejścia, ale ponieważ chciałem pokryć obszar 75%, Twoje rozwiązanie działało dobrze. Dzięki.
RDX
7

Korzystam android:scaleType="fitCenter"z satysfakcją.

Serafinów
źródło
3

Sprawdź poniższy link i spróbuj znaleźć to, czego naprawdę chcesz:

ImageView.ScaleType CENTRUM Wyśrodkuj obraz w widoku, ale nie wykonuj skalowania.

ImageView.ScaleType CENTER_CROP Skaluj obraz równomiernie (zachowaj proporcje obrazu), tak aby oba wymiary (szerokość i wysokość) obrazu były równe lub większe niż odpowiadający wymiar widoku (bez wypełnienia).

ImageView.ScaleType CENTER_INSIDE Skaluj obraz równomiernie (zachowaj proporcje obrazu), tak aby oba wymiary (szerokość i wysokość) obrazu były równe lub mniejsze od odpowiedniego wymiaru widoku (bez wypełnienia).

ImageView.ScaleType FIT_CENTER Skaluj obraz za pomocą CENTER.

ImageView.ScaleType FIT_END Skaluj obraz używając END.

ImageView.ScaleType FIT_START Skaluj obraz za pomocą przycisku START.

ImageView.ScaleType FIT_XY Skaluj obraz za pomocą FILL.

ImageView.ScaleType MATRIX Skalowanie przy użyciu matrycy obrazu podczas rysowania.

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

Nhat Dinh
źródło
1

Niedawno dowiedziałem się przypadkiem, że skoro masz większą kontrolę nad ImageView, możesz ustawić onclicklistener dla obrazu, tutaj jest próbka dynamicznie utworzonego przycisku obrazu

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
źródło
To nie jest zły pomysł. Podoba mi się.
Boris Karloff
0

W moim przypadku zadziałało dobrze. Najpierw pobierz obraz i zmień jego nazwę na iconimage, zlokalizuje go w folderze do rysowania. Możesz zmienić rozmiar, ustawiając android:layout_widthlub android:layout_height. Wreszcie mamy

 <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
źródło
0

Możesz zrobić swój widget ImageButton tak jak ja. W moim przypadku potrzebowałem widżetu o stałym rozmiarze ikon. Zacznijmy od atrybutów niestandardowych:

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

Klasa widżetu jest dość prosta (kluczową kwestią jest wypełnienie obliczeń w metodzie 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()
    }
}

Na koniec powinieneś użyć swojego widżetu w następujący sposób:

<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
źródło