创建自定义Drawable并在XML中使用

24

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

我可以实现实际的渲染逻辑等功能。

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

3个回答

28

很遗憾,由于潜在的安全问题,无法在XML文件中使用自定义可绘制项(API 23及以下版本)。请参见此处一个关于这个问题的Google Groups讨论帖子,并附有Android开发人员之一Romain Guy的回复。

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

更新:

正如LeoFarage在评论中指出的那样,从API 24开始,您现在可以在XML文件中使用自定义可绘制项,但仅限于您的应用程序包内部。


2
根据Drawable文档所述:"_从API 24开始,自定义的drawable类也可以在XML中使用_。" 我希望这个功能能够尽快添加到Compat库中。 - LeoFarage
我希望在IDE的预览模式中至少能够使用API 9中的此功能。我很习惯使用代码进行所有样式设置,但是预览功能会更加方便。感谢提供的信息! - weaknespase

8

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

自定义的drawable类可以通过多种方式在XML中使用:

使用完全限定的类名作为XML元素名。对于这种方法,自定义的drawable类必须是一个公共的顶级类。

<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" />

注意:这不受支持库支持。


8
三个问题:1)这些声明可以/需要放在哪些XML文件中?我的意思是在布局、可绘制等中。2)当具有这些特性的应用程序运行在API < 24上时会发生什么?3)在您的示例中使用 android:color 的目的是什么? - Alexander Abakumov

1
太晚了,但是因为这里没有清晰的答案,我尝试了一下。就像@Casabancai的答案从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可绘制类。

然后,您可以在任何类似以下 XML 的标记中使用它,例如 background 标记。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接