如何使用 Android 中的参数自定义此可绘制对象?
How to customize this drawable with parameters in Android?
这是 "mydrawable" 的 xml,我将其用作按钮的背景
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" android:state_pressed="false" >
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="-45"
android:endColor="@color/colorPrimary700"
android:startColor="@color/colorPrimary600"
android:type="linear" />
<corners android:radius="@dimen/ic_button_corner"></corners>
</shape>
</item>
<item android:state_focused="false" android:state_pressed="true" >
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="-45"
android:endColor="@color/colorPrimary800"
android:startColor="@color/colorPrimary700"
android:type="linear" />
<corners android:radius="@dimen/ic_button_corner"></corners>
</shape>
</item>
</selector>
这是一个用例
<Button
android:id="@+id/login_button"
style="?android:textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/mydrawable"
android:text="@string/log_in"/>
如何将此静态可绘制对象移植到具有可配置参数(例如每个项目的渐变中使用的颜色和角半径大小)的自定义视图中?
例如通过Java
MyDrawable myDrawable=new MyDrawable();
myDrawable.setGradientColors(color1, color2);
myDrawable.setCornerRadius(size);
button.setBackground(Drawable);
是否也可以通过自定义按钮(MyButton,而不是 MyDrawable)?
<MyButton
parameter_gradientcolor1:@color/color1
parameter_gradientcolor2:@color/color2
... />
编辑
这不起作用,既没有对点击事件的反应,也没有正确的渐变
public class SelectorButton extends AppCompatButton {
StateListDrawable mStateListDrawable;
public SelectorButton(Context context, AttributeSet attrs) {
super(context, attrs);
float cornerRadius = attrs.getAttributeFloatValue("app", "cornerRadius", 0);
int normalStartColor = attrs.getAttributeIntValue("app", "normalStartColor", R.color.mds_grey_400);
int normalEndColor = attrs.getAttributeIntValue("app", "normalEndColor", R.color.mds_grey_500);
int pressedStartColor = attrs.getAttributeIntValue("app", "pressedStartColor", R.color.mds_grey_400);
int pressedEndColor = attrs.getAttributeIntValue("app", "pressedEndColor", R.color.mds_grey_500);
GradientDrawable normalDrawable = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{normalStartColor, normalEndColor});
normalDrawable.setCornerRadius(cornerRadius);
GradientDrawable pressedDrawable = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{pressedStartColor, pressedEndColor});
pressedDrawable.setCornerRadius(cornerRadius);
mStateListDrawable = new StateListDrawable();
mStateListDrawable.addState(new int[]{-android.R.attr.state_pressed, -android.R.attr.state_focused},
normalDrawable);
mStateListDrawable.addState(new int[]{android.R.attr.state_pressed, -android.R.attr.state_focused},
pressedDrawable);
setBackground(mStateListDrawable);
}
}
这是在布局中
<com.utils.views.SelectorButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Login"
android:clickable="true"
app:normalEndColor="@color/mds_blue_400"
app:normalStartColor="@color/mds_red_500"
app:pressedEndColor="@color/mds_amber_500"
app:pressedStartColor="@color/mds_green_300" />
xml 中的 Drawable 只是一个 drawable,所以更像是一个图像,你不能那样设计它。
但是,您可以向自定义按钮 MyButton 添加自定义样式。
可以从这里学习https://developer.android.com/training/custom-views/create-view.html#customattr
是的,您可以通过自定义按钮执行此操作。这是一个代码片段。
public class SelectorButton extends AppCompatButton {
StateListDrawable mStateListDrawable;
public SelectorButton(Context context, AttributeSet attrs) {
super(context, attrs);
mStateListDrawable = new StateListDrawable();
GradientDrawable normalDrawable = new GradientDrawable(yourColor);
normalDrawable.setCornerRadius(yourRadius);
mStateListDrawable.addState(
new int[]{-android.R.attr.state_pressed, -android.R.attr.state_enabled}, );
setBackground(mStateListDrawable);
}
}
为了通过XML设置样式,您可以在attrs.xml
中定义颜色或圆角半径等自定义样式。如果您有任何问题,请随时提问。
编辑
现在我将向您展示如何在 XML 中声明自定义样式并使用它们。比如我想设置正常和按下状态的渐变色
在 yourProject/app/src/main/res/values
目录中,创建一个名为 attrs.xml
的新文件。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SelectorButton">
<attr name="normalStartColor" format="color"/>
<attr name="normalEndColor" format="color"/>
<attr name="pressedStartColor" format="color"/>
<attr name="pressedEndColor" format="color"/>
</declare-styleable>
</resources>
如你所见,我定义了四个attributes.Now你可以通过xml设置这些属性。
<SelectorButton
app:normalStartColor=""
app:normalEndColor=""
app:pressedStartColor=""
app:pressedEndColor=""
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
编辑:从xml
获取值
对不起我的错误。您可以像这样获得这些值。
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.SelectorButton, 0, 0);
int normalStartColor = a.getColor(R.styleable.SelectorButton_normalStartColor, 0);
a.recycle();
并且有一个按下状态。你可以这样做。
mStateListDrawable.addState(new int[]{android.R.attr.state_pressed, -android.R.attr.state_enabled}, pressedDrawable);
这是 "mydrawable" 的 xml,我将其用作按钮的背景
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" android:state_pressed="false" >
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="-45"
android:endColor="@color/colorPrimary700"
android:startColor="@color/colorPrimary600"
android:type="linear" />
<corners android:radius="@dimen/ic_button_corner"></corners>
</shape>
</item>
<item android:state_focused="false" android:state_pressed="true" >
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="-45"
android:endColor="@color/colorPrimary800"
android:startColor="@color/colorPrimary700"
android:type="linear" />
<corners android:radius="@dimen/ic_button_corner"></corners>
</shape>
</item>
</selector>
这是一个用例
<Button
android:id="@+id/login_button"
style="?android:textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/mydrawable"
android:text="@string/log_in"/>
如何将此静态可绘制对象移植到具有可配置参数(例如每个项目的渐变中使用的颜色和角半径大小)的自定义视图中?
例如通过Java
MyDrawable myDrawable=new MyDrawable();
myDrawable.setGradientColors(color1, color2);
myDrawable.setCornerRadius(size);
button.setBackground(Drawable);
是否也可以通过自定义按钮(MyButton,而不是 MyDrawable)?
<MyButton
parameter_gradientcolor1:@color/color1
parameter_gradientcolor2:@color/color2
... />
编辑
这不起作用,既没有对点击事件的反应,也没有正确的渐变
public class SelectorButton extends AppCompatButton {
StateListDrawable mStateListDrawable;
public SelectorButton(Context context, AttributeSet attrs) {
super(context, attrs);
float cornerRadius = attrs.getAttributeFloatValue("app", "cornerRadius", 0);
int normalStartColor = attrs.getAttributeIntValue("app", "normalStartColor", R.color.mds_grey_400);
int normalEndColor = attrs.getAttributeIntValue("app", "normalEndColor", R.color.mds_grey_500);
int pressedStartColor = attrs.getAttributeIntValue("app", "pressedStartColor", R.color.mds_grey_400);
int pressedEndColor = attrs.getAttributeIntValue("app", "pressedEndColor", R.color.mds_grey_500);
GradientDrawable normalDrawable = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{normalStartColor, normalEndColor});
normalDrawable.setCornerRadius(cornerRadius);
GradientDrawable pressedDrawable = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{pressedStartColor, pressedEndColor});
pressedDrawable.setCornerRadius(cornerRadius);
mStateListDrawable = new StateListDrawable();
mStateListDrawable.addState(new int[]{-android.R.attr.state_pressed, -android.R.attr.state_focused},
normalDrawable);
mStateListDrawable.addState(new int[]{android.R.attr.state_pressed, -android.R.attr.state_focused},
pressedDrawable);
setBackground(mStateListDrawable);
}
}
这是在布局中
<com.utils.views.SelectorButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Login"
android:clickable="true"
app:normalEndColor="@color/mds_blue_400"
app:normalStartColor="@color/mds_red_500"
app:pressedEndColor="@color/mds_amber_500"
app:pressedStartColor="@color/mds_green_300" />
xml 中的 Drawable 只是一个 drawable,所以更像是一个图像,你不能那样设计它。
但是,您可以向自定义按钮 MyButton 添加自定义样式。 可以从这里学习https://developer.android.com/training/custom-views/create-view.html#customattr
是的,您可以通过自定义按钮执行此操作。这是一个代码片段。
public class SelectorButton extends AppCompatButton {
StateListDrawable mStateListDrawable;
public SelectorButton(Context context, AttributeSet attrs) {
super(context, attrs);
mStateListDrawable = new StateListDrawable();
GradientDrawable normalDrawable = new GradientDrawable(yourColor);
normalDrawable.setCornerRadius(yourRadius);
mStateListDrawable.addState(
new int[]{-android.R.attr.state_pressed, -android.R.attr.state_enabled}, );
setBackground(mStateListDrawable);
}
}
为了通过XML设置样式,您可以在attrs.xml
中定义颜色或圆角半径等自定义样式。如果您有任何问题,请随时提问。
编辑
现在我将向您展示如何在 XML 中声明自定义样式并使用它们。比如我想设置正常和按下状态的渐变色
在 yourProject/app/src/main/res/values
目录中,创建一个名为 attrs.xml
的新文件。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SelectorButton">
<attr name="normalStartColor" format="color"/>
<attr name="normalEndColor" format="color"/>
<attr name="pressedStartColor" format="color"/>
<attr name="pressedEndColor" format="color"/>
</declare-styleable>
</resources>
如你所见,我定义了四个attributes.Now你可以通过xml设置这些属性。
<SelectorButton
app:normalStartColor=""
app:normalEndColor=""
app:pressedStartColor=""
app:pressedEndColor=""
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
编辑:从xml
获取值对不起我的错误。您可以像这样获得这些值。
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.SelectorButton, 0, 0);
int normalStartColor = a.getColor(R.styleable.SelectorButton_normalStartColor, 0);
a.recycle();
并且有一个按下状态。你可以这样做。
mStateListDrawable.addState(new int[]{android.R.attr.state_pressed, -android.R.attr.state_enabled}, pressedDrawable);