在XML中引用自定义形状类



我一直在扩展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资源。这可能吗?

我知道,使用标准形状之一就是通过以下示例来实现的,其中 <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类,该类别是XML中定义的ShapeDrawable。我知道android:shape属性只是传递枚举值,该值只能是矩形,椭圆形,线或环。似乎没有XML属性来指定自定义Shape类。

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

如果可能的话,我如何使用XML中的自定义Shape类?我意识到我可以很容易地创建一个自定义的View来绘制我的基本形状,但是使用Drawables似乎具有能够指定颜色等的优势。/div>

无法从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派生的)

最新更新