Come OnDraw metodo funziona in sottoclasse di Android-custom-view?
-
25-10-2019 - |
Domanda
I fronte problema di disegnare rettangolo sottoclasse della mia Android classe di visualizzazione personalizzata. Ogni volta super classe OnDraw metodo works.But sottoclasse metodo OnDraw mai eseguito. Classe Super disegnerà un rettangolo e sottoclasse trarrà 4 rettangolo all'interno della super-classe disegnata rectangle.I non può risolto questo problem.please aiutarmi.
Ecco il mio codice di esempio.
SuperClass:
public class ColorFanView extends View{
public ShapeDrawable[] mDrawables;
public ColorFanView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ColorFanView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ColorFanView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvasObject) {
super.onDraw(canvasObject);
int x = 100;
int y = 100;
int width = 80;
int height = 200;
Paint thePaint = new Paint();
thePaint.setColor(Color.WHITE);
RectF rectnagle1 = new RectF(x,y,x+width,y+height);
canvasObject.drawRoundRect(rectnagle1, 10.0f, 10.0f, thePaint);
}
}
Sottoclasse:
public class ColorFanStack extends ColorFanView{
public ColorFanStack(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public ColorFanStack(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public ColorFanStack(Context context) {
super(context);
initView();
}
public void initView() {
mDrawables = new ShapeDrawable[4];
float[] outerR1 = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
mDrawables[0] = new ShapeDrawable(new RoundRectShape(outerR1, null, null));
mDrawables[0].getPaint().setColor(Color.RED);
mDrawables[1] = new ShapeDrawable(new RectShape());
mDrawables[1].getPaint().setColor(Color.WHITE);
mDrawables[2] = new ShapeDrawable(new RectShape());
mDrawables[2].getPaint().setColor(Color.BLUE);
mDrawables[3] = new ShapeDrawable(new RectShape());
mDrawables[3].getPaint().setColor(Color.YELLOW);
}
@Override
protected void onDraw(Canvas canvasObj) {
super.onDraw(canvasObj);
int x = 100;
int y = 100;
int width = 80;
int height = 40;
int canvasSpace =5;
for (Drawable dr : mDrawables) {
dr.setBounds(x, y, x + width, y + height);
dr.draw(canvasObj);
y += height + canvasSpace;
}
}
}
XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myViewGroup" android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<com.test.colorfan.ColorFanView
android:layout_width="200dip" android:layout_height="400dip"
android:id="@+id/firstView" />
</RelativeLayout>
Please help me per quanto riguarda questo problema. Spero di avere una risposta al più presto.
Soluzione
La mia ipotesi è che il layout (modifica si prega la questione di includere il vostro layout), è definire le istanze ColorFanView in modo tale che essi hanno 0 altezza o larghezza; di conseguenza, il genitore View non li disegnare.
EDIT 7/27/2011: Habibur Rahman ha aggiunto il suo layout di XML alla domanda. Questa è la nuova risposta:
Il due classi di lavoro, ma si è aggiunto quello sbagliato per il layout (si dovrebbe avere ColorFanStack
usato al posto di ColorFanView
). Un'istanza di ColorFanStack
erediterà il disegno di ColorFanView
(in virtù del fatto che il vostro metodo di ColorFanStack.onDraw()
chiama super.onDraw()
). Penso che quello era il comportamento che si stava tentando di realizzare.
Ecco l'XML che ho usato con le classi come li si è definito:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.habecker.demo.ColorFanStack
android:layout_width="200dip" android:layout_height="400dip"
android:id="@+id/secondView" />
</RelativeLayout>