1

我有一个自定义的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>

(绿色和粉色边框仅出于调试原因;通常为黑色。)

4

1 回答 1

0

我遇到了类似的问题,只是遇到了选择器属性android:variablePadding的存在。它不会解决我的问题,因为我正在即时获取我的图像,但您可能想尝试将该属性添加到您的选择器节点。

于 2014-06-06T17:30:55.017 回答