2011-07-24 73 views
0

我面臨在我的android自定義視圖類的子類中繪製矩形的問題。每次超類的onDraw方法工作。但子類onDraw方法從未執行。超級類將繪製一個矩形,子類將在超類繪製的矩形內繪製4個矩形。我無法解決這個問題。請幫助我。onDraw方法如何在android-custom-view類的子類中工作?

這是我的示例代碼。

父類:

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

子類:

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> 

請幫我解決這個問題。希望我很快會得到答覆。

回答

1

我的猜測是您的佈局(請編輯問題以包含您的佈局)正在定義您的ColorFanView實例,使其具有0的高度或寬度;因此,父視圖不會繪製它們。

編輯7/27/2011:哈比布拉赫曼增加了他的佈局XML的問題。這是新的答案:

你的兩個班級工作,但你添加了錯誤的佈局(你應該使用ColorFanStack而不是ColorFanView)。 ColorFanStack的一個實例將繼承ColorFanView的繪圖(憑藉您的ColorFanStack.onDraw()方法調用super.onDraw())。我認爲那是你想要達到的行爲。

這裏是我的類作爲您定義他們的XML:

<?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> 

enter image description here

+0

我編輯XML file.Is是正確的方法是什麼? ColorFanView的子類是否作爲子視圖類工作?我可以在另一個自定義視圖類中調用自定義視圖嗎? –

+0

@Habibur Ra​​hman明白了;請參閱我添加到答案中的附加信息。 – cdhabecker

相關問題