【发布时间】:2012-01-26 13:48:18
【问题描述】:
我正忙于创建一个不太复杂的NinePatchDrawable 版本,它可以平铺内部面板而不是拉伸它们。
我可以实现实际的逻辑来进行渲染等。
但是,我在 XML 文件中找不到有关如何使用此 Drawable 的文档。这可能吗?也就是说,我可以使用<tileable-nine-patch> 或类似的标签来定义资源吗?
【问题讨论】:
我正忙于创建一个不太复杂的NinePatchDrawable 版本,它可以平铺内部面板而不是拉伸它们。
我可以实现实际的逻辑来进行渲染等。
但是,我在 XML 文件中找不到有关如何使用此 Drawable 的文档。这可能吗?也就是说,我可以使用<tileable-nine-patch> 或类似的标签来定义资源吗?
【问题讨论】:
很遗憾,由于潜在的安全问题,无法在 XML 文件(适用于 API 23 及更低版本)中使用自定义可绘制对象。请参阅 here 以获取有关此主题的 Google 网上论坛帖子以及来自 Android 开发人员之一 Romain Guy 的回复。
您仍然可以在 Java 代码中使用它们。
更新:
正如 LeoFarage 在 cmets 中指出的那样,从 API 24 开始,您现在可以在 XML 文件中使用自定义可绘制对象,但只能在您的应用程序包中使用。
【讨论】:
从 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" />
注意:支持库不支持。
【讨论】:
为时已晚,但由于这里没有明确的答案,我尝试了什么。正如@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">
【讨论】: