gpt4 book ai didi

android - Shape Drawable 参数取决于应用的样式

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

假设我有一个简单的可绘制形状,它绘制了一个环,如下所示:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:dither="true"
android:innerRadiusRatio="3"
android:shape="ring"
android:thicknessRatio="36"
android:useLevel="false" >

<gradient
android:centerColor="@android:color/holo_blue_bright"
android:centerY="0.001"
android:endColor="@android:color/holo_blue_dark"
android:gradientRadius="202.5"
android:startColor="@android:color/transparent"
android:type="radial"
android:useLevel="false" />

</shape>

然后我将这个形状应用为 View 背景,如下所示:

<View
android:layout_width="96dp"
android:layout_height="96dp"
android:padding="16dp"
android:background="@drawable/custom_shape" />

形状的确切细节与这个问题无关——只要说我有一个形状就足够了。现在,我不想对形状的各种参数进行硬编码。我们以thicknessRatio为例举个例子。如果我希望厚度比根据屏幕配置而改变,我当然会使用如下整数资源。我会有一个包含以下内容的 values.xml:

<item name="thickness_ratio" type="integer" format="integer">56</item>

然后,android:thicknessRatio="@integer/thickness_ratio" .

到目前为止,还不错。现在,我还想要我的可绘制形状有两种“ flavor ”——“大”一种和“小”一种,我希望查询厚度比,而不是根据配置,而是根据应用的样式到 View 。这就是样式和主题的用途。所以,这是我尝试过的:

第 1 步:声明厚度比的属性 (attrs.xml):

<resources>
<attr name="thicknessRatio" format="reference" />
</resources>

第 2 步:使用此属性 (styles,xml) 声明两个样式:

<style name="CustomShapeSmall">
<item name="thicknessRatio">@integer/thickness_ratio_small</item>
</style>

<style name="CustomShapeLarge">
<item name="thicknessRatio">@integer/thickness_ratio_large</item>
</style>

第 3 步:在 values.xml 中定义两个整数:

<item name="thickness_ratio_small" type="integer" format="integer">32</item>
<item name="thickness_ratio_large" type="integer" format="integer">56</item>

第四步:查询Shape Drawable中的自定义属性:

android:thicknessRatio="?attr/thicknessRatio"

第 5 步:将所需样式应用于 View :

<View
android:layout_width="96dp"
android:layout_height="96dp"
android:padding="16dp"
style="@style/CustomShapeSmall"
android:background="@drawable/custom_shape" />

不幸的是,这不起作用。我得到以下异常:

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/custom_shape.xml from drawable resource ID #0x7f020000
at android.content.res.Resources.loadDrawable(Resources.java:2091)
at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
at android.view.View.<init>(View.java:3364)
at android.view.View.<init>(View.java:3293)
... 28 more
Caused by: java.lang.NumberFormatException: Invalid float: "?2130771969"
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.parseFloat(StringToReal.java:310)
at java.lang.Float.parseFloat(Float.java:300)
at android.content.res.TypedArray.getFloat(TypedArray.java:287)
at android.graphics.drawable.GradientDrawable.inflate(GradientDrawable.java:827)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:901)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:837)
at android.content.res.Resources.loadDrawable(Resources.java:2087)

从异常堆栈跟踪来看,android:thicknessRatio="?attr/thicknessRatio" 行似乎解析为问号后跟 R.attr.thicknessRatio 的整数值- 但是没有执行进一步的解析来实际查询此属性的值。

我在这里错过了什么?


编辑:

Here是这个问题的完整github项目。

最佳答案

显然,不可能在 xml 可绘制对象中正确引用属性。

解决方法是创建不同的可绘制对象(一个比例较小,一个比例较大)并在您的不同样式中使用它们。然后您可以将这些样式应用到您的 View 中。

我已经向您发送了一个证明这一点的拉取请求:

https://github.com/curioustechizen/so-question-android-custom-styles/pull/1

另见:

https://stackoverflow.com/a/13471695/1369222

关于android - Shape Drawable 参数取决于应用的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20140174/

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