Fit Image в ImageButton в Android
У меня 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);
}
Ответы
Ответ 1
Я хочу, чтобы они занимали 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" />
![Sample Button]()
Ответ 2
Я использую следующий код в xml
android:adjustViewBounds="true"
android:scaleType="centerInside"
Ответ 3
Попробуйте использовать android:scaleType="fitXY"
в i-Imagebutton xml
Ответ 4
Я использую android:scaleType="fitCenter"
с удовлетворением.
Ответ 5
Перейдите по ссылке ниже и попробуйте найти то, что вы действительно хотите:
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
Ответ 6
Недавно я случайно узнал, что, поскольку у вас больше контроля над 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
}
});
Ответ 7
В моем случае это сработало. Сначала вы загружаете изображение и переименовываете его как 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" />
Ответ 8
Вы можете сделать свой виджет 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"
/>