在XML中引用自定义形状类

7

我一直在扩展标准的Shape类(如RectShapeOvalShape等),通过扩展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或样式/主题指定颜色等其他属性的优势。

1
最终,我只是通过编程实现了它。我得出的结论是,XML 可以做的事情是有意限制的,而且只提供了一部分可以通过方法调用完成的功能。 - Trevor
1
从Android L Preview开始,您不能在drawable XML中使用自定义类。此外,<shape>元素会膨胀为GradientDrawable。 - alanv
1个回答

1

自定义绘制对象不能从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>

通过使用此技巧,您不仅可以使用自定义可绘制对象设置背景,还可以设置复合绘图(它是从TextView/Button类派生的)。

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