有状态的drawbale中嵌套shape

本文介绍了一种减少Android项目中XML文件数量的方法:直接在Drawable的Selector中嵌套Shape,而非创建独立的Shape文件。这种方法适用于不会复用Shape的情况,有助于保持代码的简洁性和清晰度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直以来,定义有状态的drawable资源需要引用shape时,都是单独创建一个shape,再创建一个drawable,类似于这样的形式:

shape.xml,类似于这样

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@android:color/white"/>
</shape>

drawable.xml,类似于这样

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/shape" android:state_pressed="true" />
</selector>

偶然间看见一段代码,没有单独定义shape文件,而是将shape的内容嵌套在drawable中,类似于这样:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
    <shape>
        <solid android:color="@android:color/white" />
    </shape>
</item>
</selector>

才发现,其实如果你的shape文件没有被复用,而且又想减少文件个数,让xml的作用更加明确的话,完全可以参考这种做法。

总而言之

1 drawable中selector的item可以嵌套shape,来减少文件数量;
2 如果shape有复用,建议还是将其单列为一个xml文件。

### Android Shape 嵌套使用方法 在 Android 中,`<shape>` 元素可以通过嵌套来创建更复杂的图形。这允许开发者组合多种基本形状(如矩形、圆形等),并应用渐变、填充、描边等多种属性。 #### 创建复合形状的 XML 文件 可以在 `res/drawable/` 目录下创建一个新的 XML 文件用于定义复杂形状: ```xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 底层矩形 --> <item> <shape android:shape="rectangle"[^1]> <solid android:color="#FFCCCCCC"/> <corners android:radius="10dp"/> </shape> </item> <!-- 上层椭圆 --> <item android:left="20dp" android:right="20dp" android:top="20dp" android:bottom="20dp"> <shape android:shape="oval"> <gradient android:startColor="#FFFFCC4C" android:endColor="#FFFFAB00" android:type="radial" android:centerX="0.5" android:centerY="0.5" android:gradientRadius="70%"/> <size android:width="100dp" android:height="100dp"/> </shape> </item> </layer-list> ``` 此示例展示了一个带有圆角矩形背景和居中椭圆图案的设计。通过调整 `<item>` 的偏移量 (`left`, `right`, `top`, `bottom`) 来控制各层次之间的相对位置关系。 #### 将自定义 Drawable 应用到 View 组件上 为了使上述定义生效,只需将该资源作为任何支持 drawable 属性 (例如 background) 的 view 的值即可: ```xml <Button android:id="@+id/button_with_shape" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button with Shapes" android:background="@drawable/my_custom_shape_file"/><!-- my_custom_shape_file 是之前创建的那个XML文件名 --> ``` 这种技术不仅限于按钮;几乎所有的 UI 控件都可以利用这种方式来自定义外观[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值