Bild in ImageButton in Android anpassen

147

Ich habe 6 ImageButton in meiner Aktivität, ich setze Bilder durch meinen Code in ihnen (ohne XML).

Ich möchte, dass sie 75% des Schaltflächenbereichs abdecken. Da einige Bilder weniger Fläche abdecken, sind einige zu groß, um in den imageButton zu passen. Wie kann ich die Größe programmgesteuert ändern und anzeigen? Unten ist der Screenshot

Geben Sie hier die Bildbeschreibung ein unten ist die xml-datei

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

und ein Ausschnitt aus 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
quelle
2
Haben Sie die Skalierungsmethoden überprüft, die Android bietet? developer.android.com/reference/android/widget/…
bofredo

Antworten:

393

Ich möchte, dass sie 75% des Schaltflächenbereichs abdecken.

Verwenden Sie android:padding="20dp"(passen Sie die Auffüllung nach Bedarf an), um zu steuern, wie viel das Bild auf der Schaltfläche einnimmt.

Da einige Bilder weniger Fläche abdecken, sind einige zu groß, um in den imageButton zu passen. Wie kann ich die Größe programmgesteuert ändern und anzeigen?

Verwenden Sie a android:scaleType="fitCenter", damit Android die Bilder skaliert und android:adjustViewBounds="true"ihre Grenzen aufgrund der Skalierung anpasst.

Alle diese Attribute können ImageButtonzur Laufzeit jeweils im Code festgelegt werden. Meiner Meinung nach ist es jedoch viel einfacher, eine Vorschau in XML festzulegen und eine Vorschau anzuzeigen.

Auch nicht verwendet spfür etwas anderes als Textgröße, wird es skaliert auf der Textgröße bevorzugt je die Benutzersätze, so dass Ihre spDimensionen größer sein werden als Sie gedacht , wenn der Benutzer eine „große“ Texteinstellung. Verwenden Sie dpstattdessen, da es nicht durch die bevorzugte Textgröße des Benutzers skaliert wird.

Hier ist ein Ausschnitt davon, wie jede Schaltfläche aussehen sollte:

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

Beispielknopf

Steven Byle
quelle
@Steven Byle Entschuldigung für die späte Antwort, aber wie kann ich das gleiche anwenden, aber für ein relatives Layout?
Wir sind alle verrückt hier
8
Für diejenigen, die suchen, tun ImageButtonMethoden setScaleType(ImageView.ScaleType.CENTER) setAdjustViewBounds(true)dies programmgesteuert.
ps95
Vielen Dank :)
Pankaj Nimgade
1
Tun Sie auch android: background = "@ null", um den Standardhintergrund zu
testen
31

Ich verwende den folgenden Code in xml

android:adjustViewBounds="true"
android:scaleType="centerInside"
Pratibha Sarode
quelle
2
Ich habe ein ziemlich "flaches" Rechteck und das funktioniert gut für mich ... ein Haken: Stellen Sie sicher, dass Sie "android: src" anstelle von "android: background" verwenden. +1.
Johnny Wu
@ Johnny Danke Kumpel für den Tipp!
Bishan
8

Versuchen Sie, android:scaleType="fitXY"in i-Imagebutton xml zu verwenden

Swap-IOS-Android
quelle
Obwohl dies funktionierte und skalierte, wollte ich, dass es 75% der Fläche für eine bessere Sichtbarkeit abdeckt.
RDX
@ PowerPC versuchen, Framelayout zu verwenden, geben Höhe und Breite zu 75% und in diesem Rahmen-Layout verwenden Sie Ihre Bildschaltfläche und setzen Sie Skalentyp fit auf xy
Swap-IOS-Android
Framelayout für jeden Bildknopf im linearen Layout? Kannst du bitte klarstellen
RDX
@ PowerPC Ich benutze dies nie, aber dieser Link kann Ihnen helfen stackoverflow.com/questions/9946580/…
Swap-IOS-Android
1
@StevenByle Ich habe beide Ansätze in Betracht gezogen, aber da ich eine Flächendeckung von 75% wollte, hat Ihre Lösung gut funktioniert. Vielen Dank.
RDX
7

Ich benutze android:scaleType="fitCenter"mit Zufriedenheit.

Seraphims
quelle
3

Beziehen Sie sich auf den folgenden Link und versuchen Sie herauszufinden, was Sie wirklich wollen:

ImageView.ScaleType CENTER Zentrieren Sie das Bild in der Ansicht, führen Sie jedoch keine Skalierung durch.

ImageView.ScaleType CENTER_CROP Skalieren Sie das Bild gleichmäßig (behalten Sie das Seitenverhältnis des Bildes bei), sodass beide Abmessungen (Breite und Höhe) des Bildes gleich oder größer als die entsprechende Abmessung der Ansicht sind (minus Auffüllung).

ImageView.ScaleType CENTER_INSIDE Skalieren Sie das Bild gleichmäßig (behalten Sie das Seitenverhältnis des Bildes bei), sodass beide Abmessungen (Breite und Höhe) des Bildes gleich oder kleiner als die entsprechende Abmessung der Ansicht sind (minus Auffüllung).

ImageView.ScaleType FIT_CENTER Skaliert das Bild mit CENTER.

ImageView.ScaleType FIT_END Skaliert das Bild mit END.

ImageView.ScaleType FIT_START Skalieren Sie das Bild mit START.

ImageView.ScaleType FIT_XY Skalieren Sie das Bild mit FILL.

ImageView.ScaleType MATRIX Skalieren Sie beim Zeichnen mit der Bildmatrix.

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

Nhat Dinh
quelle
1

Ich habe kürzlich zufällig herausgefunden, dass Sie, da Sie mehr Kontrolle über eine ImageView haben, einen Onclicklistener für ein Bild festlegen können. Dies ist ein Beispiel für eine dynamisch erstellte Bildschaltfläche

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
quelle
Das ist keine schlechte Idee. Ich mag.
Boris Karloff
0

In meinem Fall hat es gut funktioniert. Zuerst laden Sie ein Bild herunter, benennen es in ein Symbolbild um und suchen es im Zeichenordner. Sie können die Größe ändern, indem Sie android:layout_widthoder einstellen android:layout_height. Endlich haben wir

 <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
quelle
0

Sie können Ihr ImageButton-Widget wie ich erstellen. In meinem Fall brauchte ich ein Widget mit einer festen Symbolgröße. Beginnen wir mit benutzerdefinierten Attributen:

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

Die Widget-Klasse ist recht einfach (der wichtigste Punkt ist das Auffüllen von Berechnungen in der onLayout- Methode):

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()
    }
}

Und zum Schluss sollten Sie Ihr Widget folgendermaßen verwenden:

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