MapView にルートを描画しようとしています。Overlay を拡張し、draw() メソッドを実装しました。ルートは適切に表示されますが、デバッグ中に draw() にブレークポイントを追加したところ、常に呼び出されていることに気付きました。
誰かが地図を移動したりズームしたりした場合にのみ再描画したい (描画はルートを描画するときにこれらの変更を考慮に入れる) 何が原因でしょうか?
MapView にルートを描画しようとしています。Overlay を拡張し、draw() メソッドを実装しました。ルートは適切に表示されますが、デバッグ中に draw() にブレークポイントを追加したところ、常に呼び出されていることに気付きました。
誰かが地図を移動したりズームしたりした場合にのみ再描画したい (描画はルートを描画するときにこれらの変更を考慮に入れる) 何が原因でしょうか?
オーバーライドできる描画方法は 2 つあります。
void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow)
説明: 地図上にオーバーレイを描画します。
boolean draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow, long when)
説明: アニメーション オーバーレイの描画呼び出し。
私はもともと2番目のものをオーバーライドしました。
最初の方法に変更した後、うまくいきました。
背景が絶えず再描画されているため、 draw メソッドが繰り返し呼び出されていると思います。"MapView.ReticleDrawMode" を DRAW_RETICLE_UNDER に設定してみてください。これは基本的に、オーバーレイの下にレチクルを描画するように mapView に指示します。そのため、背景が呼び出されたときにオーバーレイの draw メソッドは呼び出されません。これで問題が解決しました。
詳細については、こちらをご覧ください: MapView Api
draw メソッドが、描画したマーカーだけでなく、それらのマーカーの影も呼び出されることに気づかなかったとき、私はつまずきました。たとえば、2 つのマーカーがあり、シャドウが true (デフォルト設定) に設定されている場合、draw メソッドは 4 回呼び出されます (マーカーごとに 1 回、マーカーのシャドウごとに 1 回)。 )!
さらに検討した結果、Overlay draw() はドキュメントに記載されているとおりに実際に機能します。1 つは影 = true の描画で、もう 1 つは影 = false の描画です。
興味深いのは、特定のオーバーレイ draw() メソッドが、MapView に描画された各要素に対してアドバタイズされたとおりに応答することです。たとえば、私の場合、Google マップ、マップ上に描画された Google ロゴ、および自分で描画した特定のオーバーレイのそれぞれに対して応答するようです。明らかに、それぞれに 2 回 (shadow true|false)。
これはおそらく、マップをレンダリングする意図された方法です。この情報を探すのに十分な時間を見つけていないか、費やしていません。
また、私自身のケースでは、CheckBox(s) と TextView ウィジェットを使用してマップ上にレンダリングされた透明なパネルがあります。textview は常に入力をリッスンしているため、textview は draw() メソッドを強制的にノンストップで実行し、オーバーレイの再描画をトリガーします。
私にとっては奇妙なバグのように見えます。drawメソッドが継続的に呼び出されることもあれば、呼び出されないこともあります。
ここを参照してください。
私のアプリでは、マップのネットワーク データを読み込んでいるときに無期限のプログレス バー (回転する円など) が表示されます。ネットワーク データの読み込みが終了したら、プログレス バーの表示を非表示に設定していました。ただし、これにより、マップ上で行われるアニメーション (推測) によってマップ自体が再描画されるように見えるため、マップが継続的に再描画されます。これに対する簡単な解決策は、代わりに可視性をなくなったように設定することです。たとえば、これを変更します。
ProgressBar loadingIcon = (ProgressBar) findViewById(R.id.loadingIcon);
...
//Network data now finished loading...
loadingIcon.setVisibility(View.INVISIBLE);
これに:
loadingIcon.setVisibility(View.GONE);
これにより、マップから完全に削除され、アニメーション化されなくなり、 draw() が無期限に呼び出されることはありません。
これは古い問題であることは知っていますが、たった今遭遇しました。これは「価値のあるもの」の投稿です。
描画ループは、私の側のコーディング エラーであることが判明しました。ドキュメントによると、描画ルーチンが true を返す場合は、即時の更新を要求しています。false が返された場合、オーバーレイごとに 2 つのパスのみが作成されます。1 つはシャドウ true 用で、もう 1 つはシャドウ false 用です。true を返していたため、常に更新されていました。false を返すように変更した後、オーバーレイごとに 2 つのパスしか発生しませんでした。ループなし。
これを ItemizedOverlay クラスに追加するだけです。
@Override public void draw( Canvas c, MapView m, boolean shadow ) { super.draw( c, m, false );}
これにより、マップビュー オーバーレイから影が削除されます。