2012-04-09 8 views
15

私はこれについてあまり明確ではなく、どちらもドキュメントではありません。カスタムビューでsuper.onDraw()をコールバックする必要はありますか?

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    //more code here... 
} 

私の質問は、それがsuper.onDraw(canvas);を呼び出す必要がありますかどうかです:

私はカスタムビューを作成しています、私はそうのようにオーバーライドします。コードはそれがなければ正常に動作するようですが、私はそれを残しても大丈夫です。

だからそれは必要ですか?

+0

必要があるかどうかはわかりませんが、原理的には良い方法です。 – trutheality

+0

スーパークラスのインプリメンテーションも実行させたい場合は、 'super.onDraw()'を呼び出すだけです。描画に依存しない場合は、カスタムの 'View'のスーパークラスが行います(例えば、すべての必要な描画はローカルオーバーライドされたメソッドで行われます)。 –

答えて

13

スーパークラスのonDrawメソッド(一般的なビューではなくTextViewまたはKeyboardViewを呼び出す)を呼び出す場合は、super.onDrawを呼び出します。それを望んでいない場合、つまりView全体を自分で描画することを計画している場合(それはあなたのようです)、それを呼び出す理由はありません。

また、(ビューを拡張するクラスではなく)Viewを拡張する場合、super.onDrawは実際に何もしません。

KeyboardViewで線を描きたいときは、私はsuper.onDrawを呼び出します。したがって、super.onDrawはキーボードを描画し、私のカスタムLatinKeyboardView(KeyboardViewを拡張)は、キーボードの上にスワイプするパスを描画します。

+0

はい、キーに余分なものを描画したい場合は、キーボードビューにsuper.onDraw()が必要です。 –

0

実際にonDraw()メソッドをオーバーライドしない限り必須ではありません。新しいクラスがそれをオーバーライドしない場合、superのメソッドが自動的に呼び出されます。

+0

?私の質問では、私はそれを上書きしていることを明確に書いています... – yydl

+0

@yydlそしてそれはそうです。 – Whymarrh

2

はい、そうです。 TextViewをカスタム化すると、super.onDrawはTextViewの属性(テキスト、テキストの色、テキストの影など)に属するものを確実に描画します。ボタン、チェックボックスなどの他のビューと同じ...

カスタムViewがViewを拡張する場合(Viewの特定のサブクラスではなく、Viewのみ)、Viewの描画メソッド(setBackgroundDrawableなど)に対してsuper.onDraw(canvas)を残しておく方が良いです。

8

ソースコードを見ると、View.onDraw()は空の方法です。親クラスがViewの場合は、super.onDraw()を呼び出しても何もしません。まだ無害です。

とにかく進むべきかどうかは、効率性、安全性、およびスタイルの別の質問です。

関連する問題