9patch 图像作为 android 中的 CheckBox
9patch image as CheckBox in android
我对 9patches 还很陌生,我仍在尝试弄清楚它是如何工作的。我尝试用 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>
in draw9patch.bat 9path 对我来说很好:
但在 prewiev 中它不缩放:
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。一些帮助将不胜感激 :) 谢谢!
使用 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>
这样它将放大图像以填充整个 space。
深入研究,CheckBox
本身似乎不支持 9 补丁 Drawable 的缩放。 CompoundDrawable
中的 onDraw() 方法(CheckBox 派生自该方法)似乎是根据内部可绘制对象大小设置可绘制对象边界(与根据容器大小设置边界相反)——这意味着它不会't 比例。
背景(由 View
本身绘制) 正确缩放,因此您可以在其上设置可绘制的选择器。
但是如果(像我一样)你想要一个单独的背景和 'check' 可绘制,(并且你对自定义视图很满意)那么你可以继承 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);
}
}
}
我对 9patches 还很陌生,我仍在尝试弄清楚它是如何工作的。我尝试用 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>
in draw9patch.bat 9path 对我来说很好:
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。一些帮助将不胜感激 :) 谢谢!
使用 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>
这样它将放大图像以填充整个 space。
深入研究,CheckBox
本身似乎不支持 9 补丁 Drawable 的缩放。 CompoundDrawable
中的 onDraw() 方法(CheckBox 派生自该方法)似乎是根据内部可绘制对象大小设置可绘制对象边界(与根据容器大小设置边界相反)——这意味着它不会't 比例。
背景(由 View
本身绘制) 正确缩放,因此您可以在其上设置可绘制的选择器。
但是如果(像我一样)你想要一个单独的背景和 'check' 可绘制,(并且你对自定义视图很满意)那么你可以继承 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);
}
}
}