Android 定义一个可绘制的图层列表,该图层列表中有一个高度为一半的项目

Android 定义一个可绘制的图层列表,该图层列表中有一个高度为一半的项目,android,android-widget,Android,Android Widget,我在我的drawable文件夹中实现了以下按钮样式: <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle" > <st

我在我的drawable文件夹中实现了以下按钮样式:

<layer-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        >
        <item>
            <shape
                android:shape="rectangle"
                >
                <stroke android:width="1dp" android:color="#FF666666" />
                <corners
                    android:radius="@dimen/corner_radius" 
                    />
                <solid
                    android:color="#FF000000" 
                    />  
            </shape>
        </item>
        <item
            android:bottom="22dp" android:top="1dp" android:left="1dp" android:right="1dp"
            >
            <shape
                android:shape="rectangle"
                >
                <corners
                    android:topLeftRadius="@dimen/corner_radius" android:topRightRadius="@dimen/corner_radius" 
                    />
                <solid
                    android:color="#10FFFFFF" 
                    />
            </shape>            
        </item>
    </layer-list>


我的问题是,我想将第二项设置为高度的一半,相对而言,而不是绝对。您可以看到,我在这里设置了“android:bottom=“22dp”,因为我的按钮高度通常为45dp。然而,我希望第二个项目总是在一半的高度,无论我的按钮的高度。有什么想法吗?

你必须通过编程来完成

  • 给出图层列表和第二个项目的
    android:id
    属性
  • 使用
    getResources().getDrawable()
    获取对图层列表和第二项的引用。确保将图层列表强制转换为可绘制的图层
  • 您可能需要在
    层可绘制
    和第二项
    可绘制
    上调用
    Drawable.mutate()
  • 获取按钮高度并使用
    Drawable.setBounds()
    相应地修改第二层的绘图矩形
  • 使用
    LayerDrawable.setDrawableByLayerId()
    替换图层列表中更新的
    Drawable
  • 将LayerDrawable应用于按钮

  • 在@Tyler的帮助下,我找到了一种更简单的方法:

    LayerDrawable layerList = (LayerDrawable)getResources().getDrawable(R.drawable.btn_background).mutate();                
    btnBlackLayerList.setLayerInset(0, 0, 0, btnHeight/2);
    btn.setBackground(layerList);