安卓系统在 ImageButton 的合适形象

在我的活动中有6个 ImageButton,我通过它们中的代码设置图像(不使用 xml)。

我要他们覆盖75% 的纽扣区域。但是由于有些图片覆盖面积较小,有些图片太大,无法放入图片中。如何以编程方式调整大小并显示它们? 下面是截图

enter image description here 下面是 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>

还有一小段 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);
}
283007 次浏览

我要他们覆盖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" />

Sample Button

尝试在 i-Imagebuttonxml 中使用 android:scaleType="fitXY"

我满意地使用 android:scaleType="fitCenter"

我在 xml中使用以下代码

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

我最近偶然发现,由于你对 ImageView 有更多的控制,你可以为一个图像设置一个 onclicklisten 下面是一个动态创建的图像按钮的示例

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

对我来说很管用。首先,下载一个图像并将其重命名为 iconimage,将其放在可绘制文件夹中。可以通过设置 android:layout_widthandroid: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" />

参考下面的链接,试着找到你真正想要的:

在视图中居中显示图像,但要执行 没有鳞片。

CENTER _ CROP 均匀地缩放图像(维护 图像的长宽比) ,使两个尺寸(宽度和高度) 图像的大小将等于或大于对应的 视图的维度(减去填充)。

统一缩放图像(维护 图像的长宽比) ,使两个尺寸(宽度和高度) 图像的尺寸将等于或小于相应的尺寸 视图(减去填充)。

使用 CENTER 缩放图像。

使用 END 缩放图像。

使用 START 缩放图像。

使用 FILL 缩放图像。

绘制时使用图像矩阵缩放。

Https://developer.android.com/reference/android/widget/imageview

您可以像我一样制作 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>

Widget 类非常简单(关键是在 在布局上方法中填充计算) :

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