Подогнать изображение в ImageButton в Android

147

У меня есть 6 ImageButton в моей деятельности, я устанавливаю изображения через мой код в них (не используя xml).

Я хочу, чтобы они занимали 75% площади кнопок. Но когда некоторые изображения занимают меньшую площадь, некоторые слишком велики, чтобы поместиться в кнопку imageButton. Как программно изменить размер и показать их? Ниже скриншот

введите описание изображения здесь ниже находится 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>

и фрагмент 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
источник
2
Вы проверяли методы масштабирования, которые предоставляет Android? developer.android.com/reference/android/widget/...
bofredo

Ответы:

393

Я хочу, чтобы они занимали 75% площади кнопок.

Используйте android:padding="20dp"(при необходимости измените отступы), чтобы контролировать, сколько изображения занимает кнопка.

но когда некоторые изображения занимают меньшую площадь, некоторые слишком велики, чтобы поместиться в кнопку imageButton. Как программно изменить размер и показать их?

Используйте, android:scaleType="fitCenter"чтобы Android масштабировал изображения, и android:adjustViewBounds="true"чтобы они корректировали свои границы из-за масштабирования.

Все эти атрибуты могут быть установлены в коде на каждом ImageButton во время выполнения. Тем не менее, на мой взгляд, гораздо проще установить и просмотреть в xml.

Кроме того, не используйте spдля чего-либо, кроме размера текста, оно масштабируется в зависимости от предпочтения размера текста, которое задает пользователь, поэтому ваши spразмеры будут больше, чем предполагалось, если у пользователя есть «большой» параметр текста. Используйте dpвместо этого, поскольку он не масштабируется предпочтением размера текста пользователя.

Вот фрагмент того, как должна выглядеть каждая кнопка:

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

Кнопка образца

Стивен Байл
источник
@Steven Byle Извините за поздний ответ, но как я могу применить то же самое, но для относительного макета?
Мы все здесь
8
Для тех, кто ищет, ImageButtonметоды setScaleType(ImageView.ScaleType.CENTER) setAdjustViewBounds(true)делают это программно.
PS95
Большое вам спасибо :)
Pankaj Nimgade
1
Также сделайте android: background = "@ null", чтобы попробовать фон по умолчанию
C.Ikongo
31

Я использую следующий код в xml

android:adjustViewBounds="true"
android:scaleType="centerInside"
Пратибха Сароде
источник
2
У меня довольно «плоский» прямоугольник, и это хорошо работает для меня ... хотя один улов: убедитесь, что вы используете «android: src» вместо «android: background». +1.
Джонни Ву,
@johnny Спасибо, приятель, за совет!
Бишан
8

Попробуйте использовать android:scaleType="fitXY"в i-Imagebutton xml

Своп-IOS-Android
источник
хотя это работало и масштабировалось, но я хотел, чтобы это покрыло 75% площади для лучшей видимости.
RDX
@PowerPC попытайтесь использовать framelayout, чтобы получить высоту и ширину до 75%, и в этом макете кадра используйте вашу кнопку изображения и установите тип масштаба, соответствующий xy
Swap-IOS-Android
Framelayout для каждой кнопки изображения внутри linearlayout? Можете ли вы пояснить
RDX
@PowerPC Я никогда не использую это, но эта ссылка может помочь вам stackoverflow.com/questions/9946580/…
Swap-IOS-Android
1
@ StevenByle Я рассмотрел оба подхода, но так как я хотел охватить 75% площади, ваше решение работало нормально. Спасибо.
RDX
7

Я пользуюсь android:scaleType="fitCenter"с удовлетворением.

Серафима
источник
3

Перейдите по ссылке ниже и попробуйте найти то, что вы действительно хотите:

ImageView.ScaleType CENTER Центрируйте изображение в представлении, но не масштабируйте.

ImageView.ScaleType CENTER_CROP Равномерно масштабируйте изображение (сохраняйте соотношение сторон изображения), чтобы оба размера (ширина и высота) изображения были равны или больше соответствующего размера вида (за вычетом отступов).

ImageView.ScaleType CENTER_INSIDE Равномерно масштабируйте изображение (сохраняйте соотношение сторон изображения), чтобы оба размера (ширина и высота) изображения были равны или меньше соответствующего размера вида (за вычетом отступов).

ImageView.ScaleType FIT_CENTER Масштабировать изображение с помощью CENTER.

ImageView.ScaleType FIT_END Масштабировать изображение с помощью END.

ImageView.ScaleType FIT_START Масштабировать изображение с помощью START.

ImageView.ScaleType FIT_XY Масштабировать изображение, используя FILL.

ImageView.ScaleType MATRIX Масштабирование с использованием матрицы изображения при рисовании.

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

Нят Динь
источник
1

Недавно я случайно обнаружил, что, поскольку у вас больше контроля над ImageView, вы можете установить onclicklistener для изображения, это образец кнопки динамически создаваемого изображения

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
                }
            });
Дэвид
источник
Это не плохая идея. Мне нравиться.
Борис Карлофф
0

Это хорошо сработало в моем случае. Сначала вы загружаете изображение и переименовываете его в iconimage, размещаете его в папке для рисования. Вы можете изменить размер, установив android:layout_widthили android:layout_height. Наконец, у нас есть

 <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, как я. В моем случае мне нужен был виджет с фиксированным размером иконки. Давайте начнем с пользовательских атрибутов:

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

Класс виджета довольно прост (ключевой момент - это заполнение вычислений в методе 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()
    }
}

И, наконец, вы должны использовать свой виджет следующим образом:

<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"
    />
Алекс Шевелев
источник