如何缩小按钮上的drawable?

Ret*_*eto 82 android scale compound-drawables

如何使按钮上的可绘制更小?图标太大,实际上高于按钮.这是我正在使用的代码:

    <Button
    android:background="@drawable/red_button"
    android:drawableLeft="@drawable/s_vit"
    android:id="@+id/ButtonTest"
    android:gravity="left|center_vertical" 
    android:text="S-SERIES CALCULATOR"
    android:textColor="@android:color/white"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginLeft="25dp"
    android:layout_marginRight="25dp"
    android:drawablePadding="10dp">
    </Button>
Run Code Online (Sandbox Code Playgroud)

鞋面是它应该看起来的样子,它现在看起来越低.

鞋面是它应该看起来的样子,它现在看起来越低.

我尝试了这个,但没有显示图像.:-(

    Resources res = getResources();
    ScaleDrawable sd = new ScaleDrawable(res.getDrawable(R.drawable.s_vit), 0, 10f, 10f);
    Button btn = (Button) findViewById(R.id.ButtonTest);
    btn.setCompoundDrawables(sd.getDrawable(), null, null, null);
Run Code Online (Sandbox Code Playgroud)

Bud*_*ddy 86

我找到了一个非常简单有效的XML解决方案,不需要 ImageButton

为您的图像制作一个可绘制的文件,如下所示并使用它 android:drawableLeft

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
    android:id="@+id/half_overlay"
    android:drawable="@drawable/myDrawable"
    android:width="40dp"
    android:height="40dp"
    />

</layer-list>
Run Code Online (Sandbox Code Playgroud)

您可以使用android:widthandroid:height属性设置图像大小.

这样你至少可以为不同的屏幕获得相同的大小.

缺点是它与fitXY不完全相同,它会缩放图像宽度以适应X并相应地缩放图像高度.

  • 高度,宽度仅适用于API级别23及更高级别.不支持向后. (30认同)
  • 这应该是公认的答案.如果一个人不想要一个ImageButton(例如因为他们想要文本等),那么这个答案允许使用Text加零代码的Button中的大小图像. (9认同)
  • 似乎不适用于Lollipop以下的Android版本. (9认同)
  • 我做了一个像这样的新drawable然后在`android:drawableTop`我添加了新的drawable.无论我设置的宽度/高度是什么值,它都会显示默认值. (3认同)

Ron*_*nie 68

您应该使用ImageButton并指定图像android:src,并设置android:scaletypefitXY


在代码中设置缩放drawable

Drawable drawable = getResources().getDrawable(R.drawable.s_vit);
drawable.setBounds(0, 0, (int)(drawable.getIntrinsicWidth()*0.5), 
                         (int)(drawable.getIntrinsicHeight()*0.5));
ScaleDrawable sd = new ScaleDrawable(drawable, 0, scaleWidth, scaleHeight);
Button btn = findViewbyId(R.id.yourbtnID);
btn.setCompoundDrawables(sd.getDrawable(), null, null, null); //set drawableLeft for example
Run Code Online (Sandbox Code Playgroud)

  • 我们是否应该为 scaleWidth 和 scaleHeight 设置我们自己的值?它们只是描述性的吗? (2认同)

Ali*_*aka 10

按钮不会调整其内部图像的大小.

我的解决方案不需要代码操作.

它使用TextView和ImageView的布局.

布局的背景应该是红色的3d drawable.

您可能需要定义android:scaleType xml属性.

例:

<LinearLayout
    android:id="@+id/list_item"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:padding="2dp" >

    <ImageView
        android:layout_width="50dp"
        android:layout_height="fill_parent"
        android:src="@drawable/camera" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:lines="1"
        android:gravity="center_vertical"
        android:text="Hello - primary" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

BTW:

  1. 依靠不同的分辨率图标可能会导致不可预测的UI(图标太大或太小)
  2. textview中的文本(包括按钮)不会填充组件.这是一个Android问题,我不知道如何解决它.
  3. 您可以将其用作包含.

祝好运


zeh*_*zeh 6

使用ScaleDrawable作为Abhinav建议.

问题是drawable没有显示 - 它是ScaleDrawables中的某种错误.你需要以编程方式更改"级别".这适用于每个按钮:

// Fix level of existing drawables
Drawable[] drawables = myButton.getCompoundDrawables();
for (Drawable d : drawables) if (d != null && d instanceof ScaleDrawable) d.setLevel(1);
myButton.setCompoundDrawables(drawables[0], drawables[1], drawables[2], drawables[3]);
Run Code Online (Sandbox Code Playgroud)


Вла*_*шер 6

我的DiplayScaleHelper完美运行:

import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ScaleDrawable;
import android.widget.Button;

public class DisplayHelper {

  public static void scaleButtonDrawables(Button btn, double fitFactor) {
        Drawable[] drawables = btn.getCompoundDrawables();

        for (int i = 0; i < drawables.length; i++) {
            if (drawables[i] != null) {
                if (drawables[i] instanceof ScaleDrawable) {
                    drawables[i].setLevel(1);
                }
                drawables[i].setBounds(0, 0, (int) (drawables[i].getIntrinsicWidth() * fitFactor),
                    (int) (drawables[i].getIntrinsicHeight() * fitFactor));
                ScaleDrawable sd = new ScaleDrawable(drawables[i], 0, drawables[i].getIntrinsicWidth(), drawables[i].getIntrinsicHeight());
                if(i == 0) {
                    btn.setCompoundDrawables(sd.getDrawable(), drawables[1], drawables[2], drawables[3]);
                } else if(i == 1) {
                    btn.setCompoundDrawables(drawables[0], sd.getDrawable(), drawables[2], drawables[3]);
                } else if(i == 2) {
                    btn.setCompoundDrawables(drawables[0], drawables[1], sd.getDrawable(), drawables[3]);
                } else {
                    btn.setCompoundDrawables(drawables[0], drawables[1], drawables[2], sd.getDrawable());
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)