Власний визначений макет, метод onDraw () не викликається


90

Я визначив такий клас:

public class TestMyFrameLayout extends FrameLayout{

    Paint mPaint;
    public TestMyFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TestMyFrameLayout(Context context) {
        super(context);
        mPaint = new Paint();
        mPaint.setColor(Color.GREEN);
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(50f, 50f, 30, mPaint);
    }   
}

і назвав це як:

TestMyFrameLayout myFrameLayout = new TestMyFrameLayout(this);
LayoutParams myFrameLayoutParams = new LayoutParams(300,300);
myFrameLayout.setLayoutParams(myFrameLayoutParams);
setContentView(myFrameLayout);

Але насправді функція TestMyFrameLayout.onDraw (Canvas canvas) не викликається, чому?


Не могли б ви показати код там, де ви ним користуєтесь? Також додайте @Overrideперед onDraw: це перевірить наявність друкарської помилки в затемненні.
Лоран,

3
Дякую Лоран '. Моя проблема вже вирішена. Додати this.setWillNotDraw (false);
old_hou

Відповіді:


213

Вирішено. Додати this.setWillNotDraw(false); в конструктор


24
Це міг бути лише розлючений розробник, який за замовчуванням встановив для цього значення true!
Narcís Calvet,

2
чому це може допомогти?
RyanShao

5
@RyanShao для ViewGroups за замовчуванням встановлено в значення true.
ataulm

1
чому, біса, хтось захоче, щоб це було правдою? чому ??
Kai Wang

Я думаю, це оптимізація для того, коли ViewGroup - це чистий контейнер, в якому нічого не можна намалювати
hmac
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.