web-dev-qa-db-ja.com

onDraw()またはdraw()をオーバーライドしますか?

私のプロジェクトはsurfaceViewに基づいており、これまでのところ、オーバーライドするonDrawですべてのレンダリングを行ってきました。すべて大丈夫だったようです。

ただし、SDKを更新したところ、エラーメッセージが表示されました。

不審なメソッド呼び出し。おそらく「onDraw」ではなく「draw」を呼び出す必要があります

誰かがこれら2つの違いを説明できますか?

ネットで同様の質問をいくつか読んだことがありますが、理解できる説明が見つかりません。

ありがとう

21
Zippy

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()は空です。それはあなたが実装するためのものです。

11
wtsang02

私は私のプロジェクトを掃除してみましたが、問題は解決しました。それを試してみてください。

22
KarenAnne

私はそれ以来問題を抱えています。

私はそれをこのように扱います:

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()メソッドを呼び出すことができます...

これは実用的な方法だと思います。

7
friiky

Friikyが言ったように、@SuppressLint("WrongCall")は私の問題を修正しました。ただし、上記ではなく、メソッド名の前に置く必要があります。

私がしたことは、エラーコードの上にマウスを置き、右クリックしてAdd @SuppressLint("WrongCall")を選択することです

描画の場合、draw()をオーバーライドしてsuper.drawを呼び出すことは、ViewGroupが子ビューの上にコンテンツを描画したいときによく使用されます。 onDrawで描画されたコンテンツは、子の下に表示されます。

2
paynd