7

クラスを拡張して独自のカスタム シェイプ セットを作成することにより、クラスの標準範囲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);
    }
}

私がやりたいことは、Drawableこのクラスを使用して完全に XML でリソースを作成することです。これは可能ですか?

標準形状の 1 つを使用することは、<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で渡す方法です。属性が単純に列挙値を渡しているShapeDrawableことを理解しています。これは、長方形、楕円形、線、またはリングのみです。カスタムクラスandroid:shapeを指定するXML属性がないようです。Shape

ただし、にShapeDrawablesetShape()メソッドがあります。これは、カスタム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 に答える