1

攻撃方法がよくわからないという奇妙な問題があるので、誰かが以前に同様の問題を抱えていたのではないかと思っています。

ItemizedOverlay サブクラスの draw(Canvas canvas, MapView mapView, boolean shadow) メソッドをオーバーライドして、アイテム間にパスやテキストなどを描画します。オーバーライドで最初に行うことは、これらすべてのパラメーターを指定して super.draw を呼び出すことです。アプリを起動すると、オーバーライドで描画した線は本来あるべき場所にありますが、super.draw が描画する実際の OverlayItems はかなりずれています。興味深いことに、マップを左上隅 (座標 0,0) に向かって移動すると、OverlayItems が予想される場所にどんどん近づいていきます (実際、最初のものを取得すると、完全に一致するように見えます)。アイテムからポイント (0,0))。OverlayItems が (0,0) ポイントから遠ざかるようにマップを移動すると、位置情報から直線的に遠ざかります。

これまでに誰もこの問題に直面したことがなく、それが明らかでない場合のために、この動作がまだ残っている最小限の例を作成して、ここに投稿します。実際のコードは比較的大きいので、何が問題なのか誰かがわかっている場合は、それほど多くの作業を避けたいと思います。

編集:役立つかもしれない追加情報...私の描画方法は次のようになります:

public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    super.draw(canvas, mapView, shadow);
    if (!shadow) {
        // code for drawing the lines etc.
        // on the canvas (uses mapView.getProjection()) 
    }
}

オーバーレイのカスタム部分にはシャドウ レイヤーがありません (オーバーレイを問題なく拡張するときに同じロジックを使用しました)。Super.draw によって OverlayItems に対して描画されるシャドウ レイヤーは、実際には、Drawable と特定の各アイテムの予想される位置情報の中間にあります。

何が起こっているかをよりよく説明するために、avd のツリーのスクリーンショットを次に示します。4 つの赤いピンは、その上の赤い線上にある必要があり、マップを左上にスライドすると、実際には線に向かって移動します。2 つのピンとそれらの間の線はカスタム オーバーライドで描画され、super.draw は 4 つの影と 4 つの追加の赤いピンを描画します。

これは私の最初の投稿であり、複数のリンクを投稿することはできないため、3 つのスクリーンショットすべてを同じ jpg に入れました。
スクリーンショット

4

2 に答える 2

0

私はこの問題を解決しました。私が得た洞察は他の人にも役立つかもしれないので、ここで何が起こったのかを説明します。自分の質問に答えるのが適切かどうかわかりません。そうでない場合は、このテキストをどこに置くべきか教えてください。それに応じて編集/削除します。

問題は、Drawable が描画される基本的な方法についての私の誤解にありました。この誤解は、次のような Drawable.draw の JavaDoc を読んだことから生じました。

アルファ (setAlpha で設定) やカラー フィルター (setColorFilter で設定) などのオプションの効果を考慮して、境界 (setBounds で設定) を描画します。

私は元々、スクリーンショットで確認できるパスを描画する Overlay サブクラスを持っていたので、そのパスに沿ったマーカーに ItemizedOverlay を使用することにしたので (簡単にタップできるようにするなど)、クラスを少し変更することにしました。ある時点で、期待どおりに動作しているかどうかを確認するために、いくつかのアイテムを追加し、パス エンドポイントの 1 つと同じ Drawable を使用しました。draw メソッドの JavaDoc に導かれて、パスのエンドポイントを描画するためにこのようなものを使用しました

private void drawMarker(Canvas canvas, Projection projection,
    GeoPoint location, Drawable drawable) {
    Point point = projection.toPixels(location, null);
    drawable.setBounds(
        point.x,
        point.y - drawable.getIntrinsicHeight(),
        point.x + drawable.getIntrinsicWidth(),
        point.y);
    drawable.draw(canvas);
}  

しかし、super.draw 呼び出しをトレースすると、最終的に Drawable.draw が呼び出されることに気付きましたが、drawable は常に同じ境界 (この drawMarker メソッドへの前回の呼び出しで設定した境界) を持っていました。Drawable.draw が実際に Drawable を配置する場所をどのように認識しているかはまだよくわかりませんが、その時点で、質問で説明した動作は非常に明白でした。後から考えると、boundCenter と boundCenterBottom が実際に Drawable の境界を定義していることに気付くべきだったでしょう (これは彼らの JavaDoc が言っていることです)。描画したい実際のポイントはわかっています。

いずれにせよ、OverlayItems に実際に使用したかったドローアブルを使用するために少し余分な機能を追加しましたが、確かに完全に機能します。私が drawMarker で行っていることが本来の方法であるかどうかはまだ疑問に思っていますが、Drawable を配置する場所をキャンバスに伝える他の方法はわかりません。

于 2010-08-15T14:09:09.140 に答える
0

コードを見ずに診断するのは困難です。ただし、いくつかのことを確認します。

  1. MapView のプロジェクションを使用していますか? draw() が呼び出されるたびに新しいものを取得するようにしていますか?

  2. Drawables のバインドされたメソッドを確認しましたか? たとえば、boundCenter()またはboundCenterBottom()

于 2010-08-13T13:19:01.567 に答える