我正在尝试简化一些图形,要求每个密度需要9个补丁,只需使用XML drawable。这是一个相当简单的图形:
2段:
设置为背景图像时给出此结果:
看起来重新创建XML drawable似乎相当简单,并且可以避免创建5个不同的9补丁图形。然而,我已经研究了图层列表drawables,插图drawables,clip drawables - 它们似乎都要求你事先知道视图的大小(例如,为了保持2dp为插入,你需要设置{ {1}}到视图的宽度 - 2dp)。我还尝试使用insetRight
标记的shape
标记,但这并不是一个固定的大小,只是一个固定的比例(因此对于较高的视图,它会按比例缩放)。
我是否忽略了一些简单的东西,或者这是我在布局后需要以编程方式检查的东西?
答案 0 :(得分:4)
这是不可能的。这是我发现的最佳解决方案。只有xml,没有编码,没有位图,没有其他视图)
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#ff0000" />
</shape>
</item>
<item
android:top="4dp">
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#00ff00" />
</shape>
</item>
<item
android:left="10dp">
<shape
android:shape="rectangle">
<solid
android:color="#FFFFFF" />
</shape>
</item>
</layer-list>
通过代码,您可以制作具有所需行为的自己的绘图类型。 Xml drawable非常有限。恕我直言,我的建议是最接近你要求的。
答案 1 :(得分:2)
我认为@Leonidos的答案与我提议的非常接近,除了我使用drawable作为单独的视图而不是整个列表细节布局的背景。这允许它是固定的宽度并让项目文本具有自己的背景。如果我不理解你的约束,请告诉我。
以下文件是“res / drawable / list_left_border”
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle" >
<solid android:color="#e76e63" />
</shape>
</item>
<item android:top="2dp">
<shape android:shape="rectangle" >
<solid android:color="#ffc257" />
</shape>
</item>
</layer-list>
然后在“res / layout / list_item.xml”
中列表项的布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".MainActivity" >
<View
android:background="@drawable/list_left_border"
android:layout_width="8dp"
android:layout_height="match_parent" />
<TextView
android:id="@+id/listItemText"
android:textSize="15sp"
android:padding="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
这是图像。背景为粉红色,表示列表项是透明的。
答案 2 :(得分:2)
我将更进一步,并建议对AndroidGuy的回答进行轻微修改,其中包括Leonidos的回答。
相同的可绘制XML,不同的列表项XML如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="100sp">
<ImageView
android:layout_width="8dp"
android:layout_height="match_parent"
android:src="@drawable/list_left_border" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Item Text"
android:textSize="22sp" >
</TextView>
</FrameLayout>
FrameLayout提供原始背景行为,而不是分离成新视图。
我在下面展示了这一点,背景证明:
尽管如此,这并不值得。