2012-11-05 12 views
7

Rozszerzałem standardowy zakres klas Shape (RectShape, OvalShape itd.), Rozszerzając klasę Shape, aby utworzyć własny niestandardowy zestaw kształtów. Na przykład, stworzyliśmy prosty TriangleShape klasy, tak jak poniżej:Odwoływanie się do niestandardowej klasy Shape w 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); 
    } 
} 

Co chciałbym zrobić, to stworzyć Drawable zasobu całkowicie w XML przy użyciu tej klasy. czy to możliwe?

Zdaję sobie sprawę, że za pomocą jednego ze standardowych kształtach jest po prostu osiągnąć poprzez następujący przykład, gdzie element <shape> reprezentuje 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> 

Co nie mogę zobaczyć, to jak można by przekazać w formacie XML , niestandardowa klasa Shape do tego ShapeDrawable, która jest zdefiniowana w XML. Rozumiem, że atrybut android:shape po prostu przekazuje wartość wyliczenia, która może być tylko prostokątem, owalem, linią lub pierścieniem. Wygląda na to, że nie ma atrybutu XML określającego niestandardową klasę Shape.

Jednak ShapeDrawable ma metodę setShape(), która wydaje się sugerować, że mogę programowo ustawić moją niestandardową klasę Shape, ale nie zrobię tego za pomocą XML.

Jak w miarę możliwości mogę skorzystać z niestandardowej klasy Shape w XML? Zdaję sobie sprawę, że mogę bardzo łatwo stworzyć niestandardowe View, aby narysować moje podstawowe kształty, ale użycie Drawables wydaje się mieć tę zaletę, że można określać kolory, itp. I inne atrybuty w XML lub style/motywy.

+0

jakiekolwiek aktualizacje w tej sprawie? –

+1

@ M.ES W końcu po prostu zrobiłem to programowo. Doszedłem do wniosku, że to, co można zrobić za pomocą XML, jest celowo ograniczone i oferuje tylko podzbiór tego, co można zrobić za pomocą wywołań metod. – Trevor

+0

Tak, ja 2 :) Thx! –

Odpowiedz

1

Nie można odwoływać się do niestandardowych zestawień z xml, ale można łatwo utworzyć podklasę, która może być używana w układach.

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

i używać go w 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> 

Stosując tę ​​sztuczkę można nie tylko ustawić tło z niestandardowym rozciągliwej lecz także do kanału alfa związku (klasa pochodzi od TextView/przycisk)

Powiązane problemy