1. 程式人生 > >關於onDraw()方法不被執行的解決方法(setWillNotDraw)

關於onDraw()方法不被執行的解決方法(setWillNotDraw)

.引言:

想必大家以前也遇到過這個問題:出於專案的需要,我們有時需要新建一個直接或者間接繼承View的類,以便複寫View提供的onDraw()方法,但有時我們反而得不到我們想要的結果,今天就說一下onDraw()方法不被執行的解決方法。你可能也在onDraw()方法裡面設定了斷點或log,卻發現程式並沒有執行onDraw()方法,那麼你需要在你直接或者間接繼承View的類的建構函式中加入下面的語句:

        setWillNotDraw(false);

.解釋:

那麼加這條語句的作用是什麼?先看API:

        If this view doesn't do any drawing on its own, set this flag to allow further optimizations. By default, this flag is not set on View, but could be set on some View subclasses such as ViewGroup. Typically, if you override 

onDraw(Canvas) you should clear this flag.

本人外語基礎不是很好,簡要翻譯一下,如果翻譯的不好,不要扔磚啊,重複一句我的語言:要想象,沒有了想象,世界會是什麼樣。嘿嘿:

如果在當前的view上面不做任何的繪製操作,需要設定這個標記以便將來的更好的需要,預設的,這個標記在View裡是不設定的。但是像View的一些子類如ViewGroup是可以設定的,典型的,你如果複寫了onDraw(Canvas)方法,你需要清除此標記。

那麼正好,我們所實現的就是View的子類:LinearLayout,當然你也可以繼承其他的子類如:

這條語句要放在繼承類的建構函式中,如:

        public classBackgroundLayout extendsLinearLayout {

                publicBackgroundLayout(Context context, intposition) {

                        super(context);

                        // TODOAuto-generated constructor stub

                        setWillNotDraw(false);

                }

                @Override

                protected voidonDraw(Canvas canvas) {

                        // TODOAuto-generated method stub

                        super.onDraw(canvas);

                        }

                }

        }

三,擴充套件看法:

eoeandroid上面關於這條語句的看法是:

設定view是否更改,如果開發者用自定義的view,重寫ondraw()應該將呼叫此方法設定為false,這樣程式會呼叫自定義的佈局。

在此引用一下。

其實從這條語句的字面意思上可以看出:setWillNotDraw(false);就是設定將不繪畫嗎?你重寫了onDraw()當然是要進行繪畫了,所以應將此語句引數置為false.