2012-11-05 10 views
7

È stato esteso l'intervallo standard delle classi Shape (RectShape, OvalShape e così via) estendendo la classe Shape per creare il mio set personalizzato di forme. Per esempio, ho creato una semplice classe TriangleShape, in questo modo:Riferimento a una classe Shape personalizzata in XML

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); 
    } 
} 

Quello che vorrei fare è creare una risorsa Drawable interamente in XML utilizzando questa classe. È possibile?

Sono consapevole che utilizzando una delle forme standard è semplicemente raggiunto dal seguente esempio, in cui l'elemento <shape> rappresenta un 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> 

Quello che non posso vedere è come si potrebbe passare, in XML , una classe personalizzata Shape a questo ShapeDrawable che viene definita in XML. Capisco che l'attributo android:shape stia semplicemente passando un valore enum, che può essere solo rettangolo, ovale, linea o anello. Sembra che non ci sia un attributo XML per specificare una classe personalizzata Shape.

Tuttavia, lo ShapeDrawable ha un metodo setShape(), che sembra suggerire che potrei impostare la mia classe personalizzata Shape, ma non farlo tramite XML.

In che modo, se possibile, è possibile utilizzare una classe personalizzata Shape in XML? Mi rendo conto che potrei creare un oggetto personalizzato View molto facilmente per disegnare le mie forme di base, ma l'uso di Drawables sembra avere il vantaggio di poter specificare colori, ecc. E altri attributi in XML o stili/temi.

+0

eventuali aggiornamenti su questo? –

+1

@ M.ES Alla fine l'ho appena fatto a livello di programmazione. Sono giunto alla conclusione che ciò che può essere fatto via XML è intenzionalmente limitato e offre solo un sottoinsieme di ciò che può essere fatto tramite le chiamate al metodo. – Trevor

+0

Sì, io 2 :) Thx! –

risposta

1

Non è possibile fare riferimento ai drawable personalizzati da xml, ma è possibile creare facilmente una sottoclasse che può essere utilizzata nei layout.

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()); 
    }  
} 

e utilizzarlo in 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> 

Utilizzando questo trucco è possibile non solo impostare lo sfondo con drawable personalizzato ma anche impostare drawable composti (che classe è derivata da TextView/pulsante)

Problemi correlati