Как метод onDraw работает в подклассе класса android-custom-view? - PullRequest
0 голосов
/ 24 июля 2011

Я столкнулся с проблемой рисования прямоугольника в подклассе моего класса пользовательского представления 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>

Пожалуйста, помогите мне в этом вопросе.Надеюсь, я скоро получу ответ.

1 Ответ

1 голос
/ 26 июля 2011

Я предполагаю, что ваш макет (пожалуйста, измените вопрос, чтобы включить ваш макет), определяет экземпляры ColorFanView таким образом, чтобы они имели 0 высоту или ширину; следовательно, родительский View не рисует их.

РЕДАКТИРОВАТЬ 27.07.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

...