在形状XML中使用attr会导致Android崩溃

wztqucjr  于 2023-01-24  发布在  Android
关注(0)|答案(2)|浏览(187)

我在这个XML中有一个可绘制的对象:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:endColor="@color/transparent"
        android:gradientRadius="200dp"
        android:startColor="?attr/primaryDarkTransparent"
        android:type="radial" />
</shape>

startColor使用?attr/primaryDarkTransparent表示以下内容时,XML会导致崩溃:
Caused by: java.lang.RuntimeException: org.xmlpull.v1.XmlPullParserException: <internal><gradient> tag requires 'gradientRadius' attribute with radial type Caused by: org.xmlpull.v1.XmlPullParserException: <internal><gradient> tag requires 'gradientRadius' attribute with radial type
戏剧性的故事是,当我在solidstroke中使用attr时,它工作得很好,但我不知道在gradient中到底发生了什么。
如有任何建议,我们将不胜感激。

o4hqfura

o4hqfura1#

您的shape有两个问题。
1.在Android L(API 21)以下版本中,您无法在自定义可绘制对象中使用属性,因此应将?attr/primaryDarkTransparent替换为color引用。

  1. gradientRadius应为float。例如200
6rvt4ljy

6rvt4ljy2#

    • 变通方法**适用于从某种颜色(可以是纯色或具有一定透明度)渐变到具有任何透明度百分比的相同颜色。
      ***注:***这不是问题的完整/通用解决方案,因为结果将只有一种颜色,并且它将应用于ImageView(尽管它可以用于其他类型的视图)。
    • 测试:**从API 31降至24。
    • 步骤:**

创建一个形状,使其具有从某种具有任意透明度百分比的颜色(例如,黑色,无论是哪种颜色,稍后都会被覆盖)到具有另一透明度百分比的相同颜色的渐变。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <gradient
        android:type="radial"
        android:gradientRadius="115%"
        android:centerX="1"
        android:centerY="1"
        android:startColor="#fe000000"
        android:centerColor="#f0000000"
        android:endColor="#50000000" />
    <corners
        android:topLeftRadius="10dp"/>
</shape>

然后,在ImageView中添加以下内容(如果需要在前景中添加):
这里我们使用主题中的attr来覆盖渐变中使用的颜色。

android:foreground="@drawable/rounded_rectangle_with_translucent_gradient"
    android:foregroundTint="?attr/colorSurface"

或者这些作为背景

android:background="@drawable/rounded_rectangle_with_translucent_gradient"
    app:backgroundTint="?attr/colorSurface"
    • 最终结果:**

我们的ImageView覆盖另一个ImageView和一个TextView。

相关问题