Собственный определенный макет, метод onDraw () не вызывается


91

Я определил такой класс :

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: это проверит опечатку в eclipse.
Лоран '16

3
Спасибо, Лоран ». Моя проблема уже решена. Добавьте this.setWillNotDraw (false);
old_hou

Ответы:


215

Решено. Добавить this.setWillNotDraw(false); в конструктор


25
Это мог быть только озабоченный разработчик, который по умолчанию установил для него значение true!
Narcís Calvet

5
@RyanShao для ViewGroups по умолчанию имеет значение true.
ataulm

1
какого черта кто-то захочет, чтобы это было правдой? Почему??
Кай Ван

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