gpt4 book ai didi

android - 在 Android 上重用部分可绘制对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:30:13 25 4
gpt4 key购买 nike

我正在为我的应用程序准备可绘制对象。我有很多单选按钮,它们显示为带有可选框架的图像(选中时)。一个可绘制对象如下所示:

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

<item>
<inset android:insetTop="@dimen/selectionBorderSize"
android:insetLeft="@dimen/selectionBorderSize"
android:insetRight="@dimen/selectionBorderSize"
android:insetBottom="@dimen/selectionBorderSize">
<layer-list>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff"></solid>
</shape>
</item>
<item>
<bitmap android:src="@drawable/sharp7" >
<padding android:bottom="@dimen/selectionBorderSize"
android:top="@dimen/selectionBorderSize"
android:left="@dimen/selectionBorderSize"
android:right="@dimen/selectionBorderSize" />
</bitmap>
</item>
</layer-list>
</inset>
</item>
</layer-list>
</item>

<item android:state_checked="false">
<layer-list>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</item>

<item>
<inset android:insetTop="@dimen/selectionBorderSize"
android:insetLeft="@dimen/selectionBorderSize"
android:insetRight="@dimen/selectionBorderSize"
android:insetBottom="@dimen/selectionBorderSize">
<layer-list>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff"></solid>
</shape>
</item>
<item>
<bitmap android:src="@drawable/sharp7" >
<padding android:bottom="@dimen/selectionBorderSize"
android:top="@dimen/selectionBorderSize"
android:left="@dimen/selectionBorderSize"
android:right="@dimen/selectionBorderSize" />
</bitmap>
</item>
</layer-list>
</inset>
</item>
</layer-list>
</item>

<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</item>
</selector>

另一个:

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

<item>
<inset android:insetTop="@dimen/selectionBorderSize"
android:insetLeft="@dimen/selectionBorderSize"
android:insetRight="@dimen/selectionBorderSize"
android:insetBottom="@dimen/selectionBorderSize">
<layer-list>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff"></solid>
</shape>
</item>
<item>
<bitmap android:src="@drawable/sharp6" >
<padding android:bottom="@dimen/selectionBorderSize"
android:top="@dimen/selectionBorderSize"
android:left="@dimen/selectionBorderSize"
android:right="@dimen/selectionBorderSize" />
</bitmap>
</item>
</layer-list>
</inset>
</item>
</layer-list>
</item>

<item android:state_checked="false">
<layer-list>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</item>

<item>
<inset android:insetTop="@dimen/selectionBorderSize"
android:insetLeft="@dimen/selectionBorderSize"
android:insetRight="@dimen/selectionBorderSize"
android:insetBottom="@dimen/selectionBorderSize">
<layer-list>
<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff"></solid>
</shape>
</item>
<item>
<bitmap android:src="@drawable/sharp6" >
<padding android:bottom="@dimen/selectionBorderSize"
android:top="@dimen/selectionBorderSize"
android:left="@dimen/selectionBorderSize"
android:right="@dimen/selectionBorderSize" />
</bitmap>
</item>
</layer-list>
</inset>
</item>
</layer-list>
</item>

<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</item>
</selector>

如果您不想玩“找到 2 个不同点”,唯一改变的是 <bitmap> 中的图像。标签。

我在这里感觉浑身湿透1。有没有办法重用这个可绘制对象的一部分?

1 湿的,例如。不是DRY

最佳答案

简而言之:XML 可绘制对象没有参数,因此这可能会有点复杂。

通常1 我会尝试将所有单个 <item> 分开将内容放入单独的可绘制文件中,然后将它们包含在 <item android:drawable="..." /> 中.然后可以在其他可绘制对象中重复使用它们。

例如,您可以将以下项目移动到单独的文件中:

<item>
<shape android:shape="rectangle">
<solid android:color="#ffffff" />
</shape>
</item>

然后您可以在任何需要的地方包含(重用)它:

<item android:drawable="@drawable/shared_drawable" />

1 然而,在您的情况下,自 <bitmap> 以来,使用此方法您可能只节省 ~10%元素深埋在层次结构中。


另一种略显奇特的方法是使用 Gradle 任务从单个可绘制对象模板生成多个 XML 可绘制对象。这显然需要您分别使用 Gradle 或 Android Studio。

您可以将可绘制文件放入 /res/raw文件夹(或任何其他不会引起问题的文件夹)。我将此 XML 模板文件命名为 drawable_template.xml如下所述。在此文件中,我们使用 Groovy 模板变量 ${bitmapdrawable}作为实际位图可绘制对象名称的占位符:

...
<item>
<bitmap android:src="@drawable/${bitmapdrawable}"><!-- placeholder for gradle -->
...
</bitmap>
</item>
...

现在我们需要定义一个 Gradle 任务来将 drawable 模板复制到实际的 /res/drawable包含所需位图可绘制对象的文件夹:

def drawablesToGenerate = ['sharp5', 'sharp6', 'sharp7', 'sharp8']  // bitmap names
task drawableTemplate << {
drawablesToGenerate.each { drawableName -> // for each drawable
copy {
println("copy template for ${drawableName}")
from 'src/main/res/raw' // source folder
into 'src/main/res/drawable' // target folder
include 'drawable_template.xml' // template file
// rename file to final drawable
rename('drawable_template.xml', "drawable_gen_${drawableName}.xml")
expand(bitmapdrawable: "${drawableName}")
}
}
}
preBuild.dependsOn drawableTemplate

该脚本可以放入应用程序的(模块的)build.gradle文件。

现在,包含不同位图的最终可绘制对象是在编译时从单个模板文件生成的。他们的名字是drawable_gen_sharpX.xml并且可以用作普通的可绘制对象。

关于android - 在 Android 上重用部分可绘制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com