[android] 버튼의 드로어 블을 축소하려면 어떻게해야합니까?

버튼의 드로어 블을 어떻게 작게 만들 수 있습니까? 아이콘이 너무 커서 실제로 버튼보다 높습니다. 이것은 내가 사용하는 코드입니다.

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

윗부분은 어떻게 보일지, 아랫 부분은 지금 보이는 모습입니다.

윗부분은 어떻게 보일지, 아랫 부분은 지금 보이는 모습입니다.

나는 이것을 시도했지만 이미지가 표시되지 않습니다. 🙁

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



답변

당신은 사용해야 하여 ImageButton을 하고있는 이미지를 지정 android:src하고 설정 android:scaletype하는 방법에 대해fitXY


코드에서 크기 조정 된 드로어 블 설정

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


답변

필요하지 않은 매우 간단하고 효과적인 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>

android:widthandroid:height속성을 사용하여 이미지 크기를 설정할 수 있습니다 .

이렇게하면 적어도 다른 화면에 대해 동일한 크기를 얻을 수 있습니다.

단점은 이미지 너비를 X에 맞게 조정하고 그에 따라 이미지 높이를 조정하는 fitXY와 정확히 같지 않다는 것입니다.


답변

버튼은 내부 이미지의 크기를 조정하지 않습니다.

내 솔루션에는 코드 조작이 필요하지 않습니다.

TextView 및 ImageView와 함께 레이아웃을 사용합니다.

레이아웃의 배경에는 빨간색 3D 드로어 블이 있어야합니다.

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>

BTW :

  1. 다른 해상도 아이콘으로 계산하면 UI가 예측 불가능할 수 있습니다 (아이콘이 너무 크거나 너무 작음).
  2. 텍스트보기 (버튼 포함)의 텍스트가 구성 요소를 채우지 않습니다. 이것은 Android 문제이며 해결 방법을 모르겠습니다.
  3. 포함으로 사용할 수 있습니다.

행운을 빕니다


답변

Abhinav가 제안한 대로 ScaleDrawable 을 사용합니다 .

문제는 드로어 블이 표시되지 않는다는 것입니다. 이것은 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]);


답변

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


답변

setBounds“복합”드로어 블을 호출 하여 이미지 크기를 수정할 수 있습니다 .

이 코드를 사용하여 버튼의 드로어 블 크기를 자동으로 조정하십시오.

DroidUtils.scaleButtonDrawables((Button) findViewById(R.id.ButtonTest), 1.0);

이 함수로 정의 :

public final class DroidUtils {

    /** scale the Drawables of a button to "fit"
     *  For left and right drawables: height is scaled
     *  eg. with fitFactor 1 the image has max. the height of the button.
     *  For top and bottom drawables: width is scaled:
     *  With fitFactor 0.9 the image has max. 90% of the width of the button
     *  */
    public static void scaleButtonDrawables(Button btn, double fitFactor) {
        Drawable[] drawables = btn.getCompoundDrawables();

        for (int i = 0; i < drawables.length; i++) {
            if (drawables[i] != null) {
                int imgWidth = drawables[i].getIntrinsicWidth();
                int imgHeight = drawables[i].getIntrinsicHeight();
                if ((imgHeight > 0) && (imgWidth > 0)) {    //might be -1
                    float scale;
                    if ((i == 0) || (i == 2)) { //left or right -> scale height
                        scale = (float) (btn.getHeight() * fitFactor) / imgHeight;
                    } else { //top or bottom -> scale width
                        scale = (float) (btn.getWidth() * fitFactor) / imgWidth;
                    }
                    if (scale < 1.0) {
                        Rect rect = drawables[i].getBounds();
                        int newWidth = (int)(imgWidth * scale);
                        int newHeight = (int)(imgHeight * scale);
                        rect.left = rect.left + (int)(0.5 * (imgWidth - newWidth));
                        rect.top = rect.top + (int)(0.5 * (imgHeight - newHeight));
                        rect.right = rect.left + newWidth;
                        rect.bottom = rect.top + newHeight;
                        drawables[i].setBounds(rect);
                    }
                }
            }
        }
    }
}

onCreate()단추 높이와 너비는 아직 사용할 수 없기 때문에 활동 에서 호출 되지 않을 수 있습니다. 이것을 호출하거나이 솔루션onWindowFocusChanged()사용 하여 함수를 호출하십시오.

편집 :

이 기능의 첫 번째 구현은 올바르게 작동하지 않았습니다. userSeven7s 코드를 사용하여 이미지의 크기를 조정했지만 반환 ScaleDrawable.getDrawable() 이 작동하지 않는 것 같습니다 (도 마찬가지입니다 ScaleDrawable).

수정 된 코드는 setBounds이미지의 경계를 제공하는 데 사용 됩니다. Android는 이미지를 이러한 범위에 맞 춥니 다.


답변

1 개의 이미지를 사용하고 다른 크기로 표시하려면 스케일 드로어 블 ( http://developer.android.com/guide/topics/resources/drawable-resource.html#Scale )을 사용할 수 있습니다 .