【问题标题】:Create a custom Drawable and use it in XML创建一个自定义 Drawable 并在 XML 中使用它
【发布时间】:2012-01-26 13:48:18
【问题描述】:

我正忙于创建一个不太复杂的NinePatchDrawable 版本,它可以平铺内部面板而不是拉伸它们。

我可以实现实际的逻辑来进行渲染等。

但是,我在 XML 文件中找不到有关如何使用此 Drawable 的文档。这可能吗?也就是说,我可以使用<tileable-nine-patch> 或类似的标签来定义资源吗?

【问题讨论】:

    标签: android drawable


    【解决方案1】:

    很遗憾,由于潜在的安全问题,无法在 XML 文件(适用于 API 23 及更低版本)中使用自定义可绘制对象。请参阅 here 以获取有关此主题的 Google 网上论坛帖子以及来自 Android 开发人员之一 Romain Guy 的回复。

    您仍然可以在 Java 代码中使用它们。

    更新:

    正如 LeoFarage 在 cmets 中指出的那样,从 API 24 开始,您现在可以在 XML 文件中使用自定义可绘制对象,但只能在您的应用程序包中使用。

    【讨论】:

    • 根据Drawable docs:“从 API 24 开始,自定义可绘制类也可以在 XML 中使用。”。我希望将此功能添加到 Compat 库中只是时间问题。
    • 自 API 9 以来,我至少希望在 IDE 的预览模式下使用此功能。我很乐意将代码用于所有样式,但预览会非常棒。感谢您的信息!
    【解决方案2】:

    从 Android API 24 开始,自定义 Drawables 类只能在您的包内的 XML 中使用。

    自定义可绘制类可以以多种方式在 XML 中使用:

    使用完全限定的类名作为 XML 元素名。对于此方法,自定义可绘制类必须是公共顶级类。

    <com.yourapp.MyCustomDrawable
         xmlns:android="http://schemas.android.com/apk/res/android" 
         android:color="#ffff0000"/>
    

    使用 drawable 作为 XML 元素名称并从 class 属性中指定完全限定的类名称。此方法可用于公共顶级类和公共静态内部类。

    <drawable xmlns:android="http://schemas.android.com/apk/res/android"
     class="com.myapp.MyTopLevelClass$InnerCustomDrawable"
     android:color="#ffff0000" />
    

    注意:支持库不支持。

    【讨论】:

    • 三个问题:1)哪些XML文件可以/需要是那些声明?我的意思是布局、drawable 等。 2) 当一个应用程序在 API android:color 的目的是什么?
    【解决方案3】:

    为时已晚,但由于这里没有明确的答案,我尝试了什么。正如@Casabancais 从 Android 文档中复制的答案。

    用这个创建一个名为 custom_drawable.xml 的可绘制 xml

    <?xml version="1.0" encoding="utf-8"?>
    <drawable xmlns:android="http://schemas.android.com/apk/res/android"
        class="com.my.package.path.MyCustomDrawable"
        android:color="#ffff0000" />
    

    com.mypackage.MyCustomDrawable.java 应该是你的 java 可绘制类

    然后你可以在background标签中使用它来标记任何像这样的xml

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:background="@drawable/custom_drawable"
            android:layout_height="wrap_content">
    

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多