Ссылка на пользовательский класс Shape в XML

Я расширил стандартный диапазон классов Shape ( RectShape , OvalShape и т. Д.), OvalShape класс Shape чтобы создать собственный собственный набор фигур. Например, я создал простой класс TriangleShape , например:

 import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.drawable.shapes.Shape; public class TriangleLeftShape extends Shape { @Override public void draw(Canvas canvas, Paint paint) { Path path = new Path(); path.setLastPoint(0, getHeight()/2); path.lineTo(getWidth(), getHeight()); path.lineTo(getWidth(), 0); path.close(); canvas.drawPath(path, paint); } } 

То, что я хотел бы сделать, – создать ресурс Drawable полностью в XML, используя этот класс. Это возможно?

Я знаю, что использование одной из стандартных форм просто достигается в следующем примере, где элемент <shape> представляет ShapeDrawable :

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <gradient android:startColor="#FFFF0000" android:endColor="#80FF00FF" android:angle="270"/> </shape> 

То, что я не вижу, – это то, как можно передать в XML настраиваемый класс Shape для этого ShapeDrawable , который определяется в XML. Я понимаю, что атрибут android:shape просто передает значение enum, которое может быть только прямоугольником, овалом, строкой или кольцом. Кажется, что атрибут XML не задан для пользовательского класса Shape .

Тем не менее, ShapeDrawable имеет метод setShape() , который, кажется, предлагает мне программно установить мой собственный класс Shape , но не делать это через XML.

Как, если возможно, я могу использовать пользовательский класс Shape в XML? Я понимаю, что я могу создать пользовательский View очень легко, чтобы нарисовать основные фигуры, но использование Drawables похоже, имеет то преимущество, что вы можете указать цвета и т. Д. И другие атрибуты в XML или стилях / темах.

Solutions Collecting From Web of "Ссылка на пользовательский класс Shape в XML"

Пользовательские чертежи нельзя ссылаться на xml, но вы можете легко создать подкласс, который можно использовать в макетах.

 package com.example; import android.content.Context; import android.graphics.Canvas; import android.text.Layout; import android.util.AttributeSet; import android.view.View; public class TextView extends android.view.TextView { public TextView(Context context, AttributeSet attrs) { super(context, attrs); setBackground(new MyCustomDrawable()); } } 

И использовать его в layout.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="my textview with custom drawable as background" /> </FrameLayout> 

Используя этот трюк, вы можете не только установить фон с помощью пользовательского drawable, но и установить составные drawables (его класс получен из TextView / Button)