我有一个带有选择器的xml文件,它定义了按钮的不同状态:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/custom_green_button_selected_state" />
<item android:state_enabled="false" android:drawable="@drawable/custom_green_button_disabled_state" />
<item android:drawable="@drawable/custom_green_button_normal_state"/>
</selector>
然后在我的每个可绘制的xml中,我都有关于按钮如何显示的信息:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient android:type="linear" android:gradientRadius="180"
android:startColor="#6b9f41" android:endColor="#598a3d" />
<corners android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp" android:topLeftRadius="7dp"
android:topRightRadius="7dp" />
<padding android:left="15dp" android:right="15dp" android:top="10dp"
android:bottom="10dp" />
</shape>
对于我的应用程序中的大多数按钮,我只应用第一个xml作为背景,一切正常。对于一个特定的按钮,我想使用相同的xmls,但通过更改drawables的填充使按钮更瘦。我以为我会尝试在我的代码中创建一个新的StateListDrawable并添加每个状态的drawable xmls的mutate,但是,这些drawables显示为GradientDrawables,它似乎不能让我访问它们的padding属性。有什么想法吗?
答案 0 :(得分:1)
背景可绘制的填充也由View类中的setPadding设置。
您可以通过在setBackgroundDrawable之后调用setPadding来设置填充。
这是core / java / android / view / View.java:
/**
* Set the background to a given Drawable, or remove the background. If the
* background has padding, this View's padding is set to the background's
* padding. However, when a background is removed, this View's padding isn't
* touched. If setting the padding is desired, please use
* {@link #setPadding(int, int, int, int)}.
*
* @param d The Drawable to use as the background, or null to remove the
* background
*/
public void setBackgroundDrawable(Drawable d) {
boolean requestLayout = false;
mBackgroundResource = 0;
/*
* Regardless of whether we're setting a new background or not, we want
* to clear the previous drawable.
*/
if (mBGDrawable != null) {
mBGDrawable.setCallback(null);
unscheduleDrawable(mBGDrawable);
}
if (d != null) {
Rect padding = sThreadLocal.get();
if (padding == null) {
padding = new Rect();
sThreadLocal.set(padding);
}
if (d.getPadding(padding)) {
setPadding(padding.left, padding.top, padding.right, padding.bottom);
}
答案 1 :(得分:0)
对于一个特定的按钮,我想使用相同的xmls但是要制作 通过更改drawables的填充来更换skinnier。
那就是你的问题。您不应使用填充来设置按钮大小。而是依赖layout_height
和layout_width
或以onMeasure
(在自定义按钮中)以编程方式设置