我有一个自定义的box_background.xml
可绘制对象,它应该为一个盒子添加一些装饰(例如,RelativeLayout):
- 小边框 (2dp)
- 左侧和底部的阴影 (8dp)
按下时,视图应该会发生一些变化:
- 阴影更小(比如 4dp)
- 盒子的内容稍微向左和底部移动(即“朝向阴影”)
- (2dp 边框保持不变,但当然它仍然必须很好地包裹移动的内容。)
就其本身而言,box_background_normal
按预期工作(当box_background_state_pressed
从选择器中注释掉时)。我不明白的是:如果box_background_state_pressed
包含带有填充的项目(请参阅下面的 XML),即使没有按下该填充也会影响该框。
也许<padding>
只是不能用于实现这种“状态按下”功能......?
我的具体问题:
- 为什么在不按下
box_background_state_pressed
时填充会影响视图? - 我怎样才能实现我上面描述的那种“状态按下”效果?
示例 1:完全不使用时的未按下状态box_background_state_pressed
(从选择器中注释掉):边框、阴影和内容都可以。
例2:使用时未按下状态box_background_state_pressed
。这已破了; box_background_state_pressed
即使没有按下框,较大的填充也会影响内容。
Android API 级别 18。测试设备:Nexus 7 (2013)。
box_background.xml
:
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/box_background_state_pressed" />
<item android:drawable="@drawable/box_background_normal" />
</selector>
box_background_normal.xml
:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="8dp" android:right="8dp">
<shape android:shape="rectangle">
<solid android:color="#33000000" />
</shape>
</item>
<item android:bottom="8dp" android:left="8dp">
<shape android:shape="rectangle">
<stroke android:width="2dp" android:color="#FF22BB00" />
<padding
android:left="10dp"
android:bottom="10dp"
android:right="2dp"
android:top="2dp"
/>
</shape>
</item>
</layer-list>
box_background_state_pressed.xml
(你可能用不到 3 层来做到这一点;我只是在试验):
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:top="4dp" android:right="4dp">
<shape android:shape="rectangle">
<solid android:color="#33000000" />
</shape>
</item>
<item android:bottom="4dp" android:left="4dp">
<shape android:shape="rectangle">
<stroke android:width="2dp" android:color="#FFFF6677" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#00FFFFFF" />
<padding
android:left="2dp"
android:bottom="2dp"
android:right="10dp"
android:top="10dp"
/>
</shape>
</item>
</layer-list>
(绿色和粉色边框仅出于调试原因;通常为黑色。)