Встановити зображення в ImageButton в Android


147

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

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

введіть тут опис зображення нижче - 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);      
    }

2
Ви перевіряли методи масштабування, які забезпечує Android? developer.android.com/reference/android/widget/…
bofredo

Відповіді:


393

Я хочу, щоб вони покривали 75% площі кнопок.

Використовуйте android:padding="20dp"(відрегулюйте підкладку за потребою), щоб контролювати, скільки зображення займає кнопка.

але там, де деякі зображення займають меншу площу, деякі занадто великі, щоб вписатися у зображення кнопки. Як програмно змінити розмір і показати їх?

Використовуйте для того, 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


1
Також зробіть android: background = "@ null", щоб спробувати фон за замовчуванням
C.Ikongo

31

Я використовую наступний код у xml

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

2
У мене досить «плоский» прямокутник, і це добре працює для мене ... хоча один улов: переконайтесь, що ви використовуєте «android: src» замість «android: background». +1.
Джонні Ву

@johnny Спасибі товариш за пораду!
Bishan

8

Спробуйте використовувати android:scaleType="fitXY"в i-Imagebutton xml


Хоча це працювало і масштабувало, але я хотів, щоб він охоплював 75% площі для кращої видимості.
RDX

@PowerPC спробуйте використовувати framelayout, дайте висоту та ширину до 75%, а для цього макета кадру використовуйте кнопку зображення та встановіть тип масштабу, відповідний xy
Swap-IOS-Android

рамка для кожного зображення кнопки всередині лінійного проміжку? можете u plz уточнити
RDX

@PowerPC Я ніколи цього не використовую, але це посилання може допомогти вам stackoverflow.com/questions/9946580/…
Swap-IOS-Android

1
@StevenByle я розглядав обидва підходи, але оскільки я хотів охопити 75% площі, ваше рішення спрацювало чудово. Дякую.
RDX


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

У моєму випадку це добре спрацювало. По-перше, ви завантажуєте зображення і перейменовуєте його як зображення, розміщуєте його в папці, що малюється. Ви можете змінити розмір, встановивши 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"
    />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.