Android 在XML中引用自定义形状类

Android 在XML中引用自定义形状类,android,drawable,Android,Drawable,我一直在扩展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 Tri

我一直在扩展
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创建一个
可绘制的
资源。这可能吗

我知道使用一个标准形状是通过以下示例实现的,其中
元素表示一个
可变形的

<?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
类传递给这个用XML定义的
ShapeDrawable
。我知道,
android:shape
属性只是传递一个枚举值,它只能是矩形、椭圆形、直线或环形。似乎没有XML属性来指定自定义的
Shape

但是,
ShapeDrawable
有一个
setShape()
方法,它似乎建议我可以通过编程方式设置我的自定义
Shape
类,但不能通过XML进行设置


如果可能,我如何使用XML中的自定义
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>


通过使用此技巧,您不仅可以使用自定义可绘制设置背景,还可以设置复合可绘制设置(it类派生自TextView/Button)

@M.ES最后,我只是通过编程实现了这一点。我得出的结论是,通过XML可以做的事情是有意限制的,并且只提供了通过方法调用可以做的事情的一个子集。此外,该元素还可充气至梯度拉伸。