22

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

ただし、SDKを更新したところ、次のようなエラーが表示されます。

疑わしいメソッド呼び出し。おそらく「onDraw」ではなく「draw」と呼ぶべきです

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

ネットで似たような質問をいくつか読んだのですが、理解できる説明が見つかりませんでした。

ありがとう

4

6 に答える 6

22

プロジェクトをクリーンアップしてみましたが、問題は解決しました。それを試してみてください。

于 2013-05-28T08:10:28.043 に答える
12

SurfaceView.draw()は基本的にView.draw()を呼び出します。描画を実装する場合は、View.onDraw()で実行する必要があります。これは、ソースコードのコメントにも記載されている実装用です。

このメソッドはViewGroup.drawChild()によって呼び出され、各子ビューにそれ自体を描画させます。このdraw()メソッドは実装の詳細であり、オーバーライドしたり、ViewGroup.drawChild()以外の場所から呼び出したりすることを目的としたものではありません。

それらの違いについて:
draw():

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

于 2013-02-14T00:14:56.327 に答える
7

私はこれまで問題を抱えています。

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

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

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

于 2013-09-05T08:53:59.113 に答える
2

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

于 2014-08-12T12:55:37.883 に答える
2

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

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

于 2014-10-16T04:46:18.937 に答える
-3

onDraw画面に描画するためのキャンバスを提供します。

draw()画面に手動でキャンバスを描画できます(キャンバスは自分で作成する必要があります)。

于 2013-02-14T00:03:46.760 に答える