0

我面临在我的 android 自定义视图类的子类中绘制矩形的问题。每次超类 onDraw 方法都有效。但子类 onDraw 方法从未执行。超类将绘制一个矩形,子类将在超类绘制的矩形内绘制 4 个矩形。我无法解决这个问题。请帮助我。

这是我的示例代码。

超类:

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>

请帮助我解决这个问题。希望我能尽快得到答复。

4

1 回答 1

1

我的猜测是您的布局(请编辑问题以包含您的布局)正在以这样的方式定义您的 ColorFanView 实例,即它们的高度或宽度为 0;因此,父 View 不会绘制它们。

编辑 7/27/2011:Habibur Ra​​hman 将他的布局 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>

在此处输入图像描述

于 2011-07-25T20:30:18.480 回答