7

我一直在通过扩展类来创建我自己的自定义形状集来扩展类的标准范围ShapeRectShape等等)。例如,我创建了一个简单的类,如下所示:OvalShapeShapeTriangleShape

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>元素表示 a 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 中定义的 this ShapeDrawable。我知道该android:shape属性只是传递一个枚举值,它只能是矩形、椭圆形、线条或环形。似乎没有指定自定义Shape类的 XML 属性。

但是,ShapeDrawable有一个setShape()方法,这似乎表明我可以以编程方式设置我的自定义Shape类,但不能通过 XML 来设置。

如果可能,我如何使用ShapeXML 中的自定义类?我意识到我可以View很容易地创建一个自定义来绘制我的基本形状,但是使用Drawables似乎具有能够指定颜色等的优势,以及 XML 或样式/主题中的其他属性。

4

1 回答 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)

于 2015-09-07T09:35:11.203 回答