Android'de ImageButton'daki Görüntüyü Sığdır


147

Etkinliğimde 6 ImageButton var, resimlerimi kodum aracılığıyla (xml kullanmadan) ayarladım.

Düğme alanının% 75'ini kapsamasını istiyorum. Ancak bazı görüntüler daha az alanı kapladığı için, bazıları imageButton'a sığmayacak kadar büyüktür. Programlı olarak nasıl yeniden boyutlandırılır ve gösterilir? Aşağıda ekran görüntüsü

resim açıklamasını buraya girin aşağıda xml dosyası

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

ve myClass.java kod parçacığı:

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
android sağlayan ölçeklendirme yöntemleri kontrol ettiniz mi? developer.android.com/reference/android/widget/…
bofredo

Yanıtlar:


394

Düğme alanının% 75'ini kapsamasını istiyorum.

android:padding="20dp"Görüntünün düğmede ne kadar yer kapladığını kontrol etmek için kullanın (dolguyu gerektiği gibi ayarlayın).

ancak bazı resimler daha az alanı kapladığı için bazıları imageButton'a sığmayacak kadar büyüktür. Programlı olarak nasıl yeniden boyutlandırılır ve gösterilir?

Bir kullan android:scaleType="fitCenter"Android Ölçeği resminin olması ve android:adjustViewBounds="true"onları nedeniyle ölçekleme için kendi sınırlarını ayarlamak için.

Bu özelliklerin tümü ImageButtonçalışma zamanında her birinde kod olarak ayarlanabilir . Ancak, bence xml olarak ayarlamak ve önizlemek çok daha kolay.

Ayrıca, yok kullanmak spiçin böylece metin boyutu dışında herhangi bir amaçla, bu metin boyutu tercihine kullanıcı setlerini bağlı ölçeklendirilir spboyutları kullanıcı bir "büyük" metin ayarı kullanılıp düşündüğünden daha yüksek olacaktır. dpKullanıcının metin boyutu tercihine göre ölçeklenmediği için kullanın .

Her düğmenin nasıl görünmesi gerektiğine dair bir pasaj:

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

Örnek Düğmesi


@Steven Byle Geç cevap için özür dilerim, ancak aynı şeyi ancak göreceli bir düzen için nasıl uygulayabilirim?
Hepimiz

8
Bakanlar için ImageButtonyöntemler setScaleType(ImageView.ScaleType.CENTER) setAdjustViewBounds(true)bunu programlı olarak yapar.
ps95

Çok teşekkür ederim :)
Pankaj Nimgade

1
Ayrıca android: background = "@ null" varsayılan arka planı denemek için
C.Ikongo

31

Aşağıdaki kodu kullanıyorum xml

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

2
Oldukça "düz" bir dikdörtgen var ve bu benim için iyi çalışıyor ... bir yakalamak olsa da: "android: arka plan" yerine "android: src" kullandığınızdan emin olun. +1.
Johnny Wu

@johnny Bahşiş için teşekkürler dostum!
Bishan

8

android:scaleType="fitXY"İ-Imagebutton xml içinde kullanmaya çalışın


Bu işe yaradı ve ölçeklendirilmiş olsa da, daha iyi görünürlük için alanın% 75'ini kaplamasını istedim.
RDX

Xy için ımagebutton ve set ölçekli tip uyum kullanmak düzenini framelayout vermek heigh ve genişlik% 75 ve bu çerçevenin içine kullanmaya çalışır @PowerPC
Takas-IOS-Android

lineerlayout içindeki her imagebuttonu için framelayout? u plz açıklığa kavuşturabilir
RDX

@PowerPC Bunu asla kullanmıyorum ama bu bağlantı size stackoverflow.com/questions/9946580/…
Swap-IOS-Android

1
@StevenByle Her iki yaklaşımı da düşündüm, ancak% 75 alan kapsamı istediğimden, çözümünüz iyi çalıştı. Teşekkürler.
RDX


3

Aşağıdaki bağlantıya bakın ve gerçekten ne istediğinizi bulmaya çalışın:

ImageView.ScaleType CENTER Görüntüyü görünümde ortalar ancak ölçeklendirme yapmaz.

ImageView.ScaleType CENTER_CROP Görüntüyü her iki boyutunun (genişlik ve yükseklik) görünümün karşılık gelen boyutuna (eksi dolgu) eşit veya daha büyük olacak şekilde eşit olarak ölçeklendirin (görüntünün en boy oranını koruyun).

ImageView.ScaleType CENTER_INSIDE Görüntünün her iki boyutu (genişlik ve yükseklik), görünümün karşılık gelen boyutuna (eksi dolgu) eşit veya daha küçük olacak şekilde görüntüyü eşit olarak ölçeklendirin (görüntünün en boy oranını koruyun).

ImageView.ScaleType FIT_CENTER CENTRE kullanarak görüntüyü ölçeklendirin.

ImageView.ScaleType FIT_END END'i kullanarak görüntüyü ölçeklendirin.

ImageView.ScaleType FIT_START START'ı kullanarak görüntüyü ölçeklendirin.

ImageView.ScaleType FIT_XY FILL kullanarak görüntüyü ölçeklendirin.

ImageView.ScaleType MATRIX Çizim yaparken görüntü matrisini kullanarak ölçeklendirin.

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


1

Kısa bir süre önce, bir ImageView üzerinde daha fazla kontrole sahip olduğunuzdan, bir görüntü için onclicklistener ayarlayabileceğinizden, burada dinamik olarak oluşturulmuş bir resim düğmesinin bir örneği olduğunu kazara öğrendim.

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

Bu kötü bir fikir değil. Severim.
Boris Karloff

0

Benim durumumda iyi çalıştı. İlk olarak, bir görüntüyü indirir ve iconimage olarak yeniden adlandırırsınız, çekilebilir klasörde bulur. Sen ayarlayarak boyutunu değiştirebilir android:layout_widthveya android:layout_height. Sonunda,

 <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

ImageButton widget'ınızı yaptığım gibi yapabilirsiniz. Benim durumumda, sabit simge boyutuna sahip bir widget'a ihtiyacım vardı. Özel özelliklerden başlayalım:

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

Widget sınıfı oldukça basittir (anahtar nokta, onLayout yönteminde doldurma hesaplamalarıdır ):

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

Ve sonunda widget'ınızı şu şekilde kullanmalısınız:

<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"
    />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.