我一直在扩展标准的Shape
类(如RectShape
、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);
}
}
我希望做的是使用这个类完全通过XML创建一个Drawable资源。这可行吗?
我知道使用标准形状之一只需要像下面的例子那样简单地实现,其中元素表示一个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
中。我理解android:shape
属性仅传递一个枚举值,该值仅可以是矩形、椭圆形、线条或环。似乎没有XML属性可以指定自定义的Shape
类。然而,
ShapeDrawable
有一个setShape()
方法,这似乎表明我可以以编程方式设置我的自定义Shape
类,但不能通过XML实现。如果可能的话,如何在XML中使用自定义的
Shape
类?我意识到我可以很容易地创建一个自定义View
来绘制我的基本形状,但使用Drawables
似乎具有通过XML或样式/主题指定颜色等其他属性的优势。