如何让布局用作背景的Drawable中五种颜色宽度均等?
解决Drawable中等宽色块显示不均的问题
你的问题出在使用固定dp值设置item偏移,且shape的size仅为Drawable的固有尺寸,当Drawable适配不同宽度的父容器时,色块宽度会被拉伸不均。以下是两种Drawable层面的解决方案:
方案一:使用线性渐变实现等宽色块(兼容性好,支持所有Android版本)
通过gradient的颜色节点百分比分配宽度,确保每个色块始终占据父容器1/5的宽度:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 等宽纯色块背景 --> <item> <shape android:shape="rectangle"> <gradient android:angle="0" android:type="linear" <!-- 按20%的节点划分5个等宽色块 --> android:colorStop="0.0, @color/red_background_70_lighter" android:colorStop="0.2, @color/red_background_70_lighter" android:colorStop="0.2, @android:color/holo_green_light" android:colorStop="0.4, @android:color/holo_green_light" android:colorStop="0.4, @android:color/holo_orange_dark" android:colorStop="0.6, @android:color/holo_orange_dark" android:colorStop="0.6, @android:color/holo_blue_dark" android:colorStop="0.8, @android:color/holo_blue_dark" android:colorStop="0.8, @android:color/darker_gray" android:colorStop="1.0, @android:color/darker_gray"/> <size android:height="250dp"/> </shape> </item> <!-- 外边框 --> <item android:top="-2dp" android:right="-2dp" android:left="-2dp" android:bottom="-2dp"> <shape> <solid android:color="@android:color/transparent"/> <stroke android:width="1dp" android:color="@android:color/holo_orange_light"/> </shape> </item> </layer-list>
方案二:使用LinearLayout作为Drawable(Android 8.0+支持)
直接用线性布局的权重分配实现等宽,逻辑更直观:
首先创建边框Drawable(border_shape.xml):
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@android:color/transparent"/> <stroke android:width="1dp" android:color="@android:color/holo_orange_light"/> </shape>
然后创建主Drawable:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="250dp" android:orientation="horizontal"> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@color/red_background_70_lighter"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/holo_green_light"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/holo_orange_dark"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/holo_blue_dark"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/darker_gray"/> <!-- 叠加边框 --> <View android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="-1dp" android:background="@drawable/border_shape"/> </LinearLayout>
原代码问题说明
- 固定
left/right偏移值:不同屏幕宽度下,剩余空间分配不均,导致色块宽度不一致。 shape的size属性:仅定义Drawable的固有尺寸,当Drawable被拉伸适配父容器时,该设置不会约束色块的实际显示宽度。
内容的提问来源于stack exchange,提问作者DevPeter
相关产品推荐
相关产品推荐

