9补丁图像作为Android

时间:2015-10-21 12:06:21

标签: android xml layout nine-patch

我对9个小包非常陌生,我仍然试图弄清楚它是如何工作的。我尝试使用9个补丁制作CheckBox,但它们无法正确缩放。所以我的XML文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/checkbox_cases_checked" android:state_checked="true" />
    <item android:drawable="@drawable/checkbox_cases_default" android:state_checked="false"  />
    <item android:drawable="@drawable/checkbox_cases_default" />
</selector>
在draw9patch.bat 9path中的

对我来说很好: Scaling 9patch in draw9patch.bat 但是在预测中它不会缩放:

Scaling in AS preview

CheckBox的布局代码如下所示:

<android.support.v7.widget.AppCompatCheckBox
                android:id="@+id/stepCheckBox1"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:button="@drawable/checkbox_cases" />

我真的不知道为什么这张图片不能缩放48dp到48dp。一些帮助将不胜感激:)谢谢!

2 个答案:

答案 0 :(得分:1)

深入研究,看起来CheckBox本身并不支持缩放9-patch Drawables。 CompoundDrawable中的onDraw()方法(从中派生CheckBox)似乎设置了从内部可绘制大小的可绘制边界(而不是从容器大小设置边界) - 这意味着它没有& #39; t scale。

背景(由View本身绘制) 正确缩放,因此你可以设置选择器drawable。

但是,如果(像我一样)你想要一个单独的背景并且检查&#39; drawable,(并且您对自定义视图感到满意)然后您可以将ImageView作为子类,并改为Checkable

public class StyledCheckBox extends ImageView implements Checkable, View.OnClickListener {
    private static final int[] CHECKED_STATE = { android.R.attr.state_checked };

    private boolean mChecked;

    public StyledCheckBox(Context context) {
        this(context, null, 0);
    }

    public StyledCheckBox(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public StyledCheckBox(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs);

        setFocusable(true);
        setOnClickListener(this);

        // Other constructor stuff...
    }

    @Override
    public void onClick(View v) {
        toggle();
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void setChecked(boolean checked) {
        if (mChecked == checked) return;
        mChecked = checked;
        refreshDrawableState();
    }

    @Override
    public void toggle() {
        setChecked(!mChecked);
    }

    @Override
    public int[] onCreateDrawableState(int extraSpace) {
        if (isChecked()){
            int[] state = super.onCreateDrawableState(extraSpace + 1);
            mergeDrawableStates(state, CHECKED_STATE);
            return state;
        } else {
            return super.onCreateDrawableState(extraSpace);
        }
    }
}

答案 1 :(得分:-1)

使用ImageView并使用scalyType centerCrop

<FrameLayout
    android:layout_width="48dp"
    android:layout_height="48dp">

    <ImageView
        android:src="@drawable/checkbox_cases"
        android:scaleType="centerCrop"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <android.support.v7.widget.AppCompatCheckBox
        android:id="@+id/stepCheckBox1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

这样它会放大图像以填满整个空间。