私のプロジェクトはsurfaceViewに基づいており、これまでのところ、オーバーライドするonDrawですべてのレンダリングを行ってきました。すべて大丈夫だったようです。
ただし、SDKを更新したところ、エラーメッセージが表示されました。
不審なメソッド呼び出し。おそらく「onDraw」ではなく「draw」を呼び出す必要があります
誰かがこれら2つの違いを説明できますか?
ネットで同様の質問をいくつか読んだことがありますが、理解できる説明が見つかりません。
ありがとう
SurfaceView.draw() は基本的に View.draw(); を呼び出します描画を実装したい場合は、 View.onDraw() で実装する必要があります。これは、ソースコードのコメントでさえも実装するためのものです。
このメソッドは、ViewGroup.drawChild()によって呼び出され、各子ビューにそれ自体を描画させます。このdraw()メソッドは実装の詳細であり、オーバーライドしたり、ViewGroup.drawChild()以外の場所から呼び出すことを意図したものではありません。
それらの違いについては:
ドロー():
13416 /*
13417 * Draw traversal performs several drawing steps which must be executed
13418 * in the appropriate order:
13419 *
13420 * 1. Draw the background
13421 * 2. If necessary, save the canvas' layers to prepare for fading
13422 * 3. Draw view's content
13423 * 4. Draw children
13424 * 5. If necessary, draw the fading edges and restore layers
13425 * 6. Draw decorations (scrollbars for instance)
13426 */
onDraw()は空です。それはあなたが実装するためのものです。
私は私のプロジェクトを掃除してみましたが、問題は解決しました。それを試してみてください。
私はそれ以来問題を抱えています。
私はそれをこのように扱います:
1)次のようなメソッドを宣言します。
@SuppressLint("WrongCall")
public void drawTheView() {
theCanvas = null;
try{
theCanvas = getHolder().lockCanvas();
if(theCanvas != null) {
onDraw(theCanvas);
}
} finally {
getHolder().unlockCanvasAndPost(theCanvas);
}
}
2)これで、onDraw()メソッドを変更できます。
@Override
public void onDraw(Canvas canvas) {
//Do some drawing
}
エラーが発生することなく、どこからでもdrawTheView()メソッドを呼び出して、この方法でonDraw()メソッドを呼び出すことができます...
これは実用的な方法だと思います。
Friikyが言ったように、@SuppressLint("WrongCall")
は私の問題を修正しました。ただし、上記ではなく、メソッド名の前に置く必要があります。
私がしたことは、エラーコードの上にマウスを置き、右クリックしてAdd @SuppressLint("WrongCall")
を選択することです
描画の場合、draw()をオーバーライドしてsuper.drawを呼び出すことは、ViewGroupが子ビューの上にコンテンツを描画したいときによく使用されます。 onDrawで描画されたコンテンツは、子の下に表示されます。