24

私の Google マップ アプリケーションには、移動するマーカーをたどる follow メソッドがあります。次の場合、すべての通常の方法 (dblclick、dblleftclick、mousewheel、および touch イベント) によるズームを許可し、あらゆる種類のパンを無効にしたいと考えています。問題は、マウスホイールと dblclick でズームすると、マップがマウスの位置にパンされることです。すべてを問題なく無効にできますが、ズームを許可したいです。jquery マウスホイール プラグインを使用し、デルタを使用してズームを変更することで、マウスホイールの問題を解決しました。

これを行う簡単な方法はありますか、またはすべての異なるタッチおよびマウスイベントのリスナーを作成する必要がありますか?

編集

ダブルクリック、マウスホイールのズーム、およびドラッグを既に無効にしていますが、ダブルクリック機能を引き続き使用したいと考えています。そこにもタッチイベントが必要ですが、イベントが発生した場所ではなく、中心からズームしたいと考えています。本当の問題は、Google が既に処理しているイベントを複製することですが、機能を少し変更することです

var options = {
    disableDoubleClickZoom: true,
    draggable: false,
    scrollwheel: false,
    panControl: false
};

this.map = new google.maps.Map(document.getElementById('map'), options);

私の理想的な解決策は、disableDoubleClickPananddisableScrollwheelPanまたはdraggableオプションが実際にあり、あらゆる種類のすべてのドラッグを防止することです

編集

これは、デスクトップとモバイルのすべてのデバイスに適用されます。

4

3 に答える 3

3

私はオプションの組み合わせで行きました。まず、達成した結果を得るために発生したデスクトップ イベント (タッチ、ダブルクリック、ダブル左クリック、およびマウス ホイール) をオーバーライドする必要がありました。

タッチ スクリーン デバイスでは、2 回以上のタッチがあった場合、マーカーへのすべての更新を一時停止しました。これは、ズーム操作時にピンチ イベントがジャンプしないことを意味していました。

通常の Web デスクトップ デバイスでは、マップ上のズーム イベントとダブル クリック イベントを無効にし、独自のイベント ハンドラーを書き直しました。

それらを区別するために、window オブジェクトの ontouchstart イベントをチェックしました。

function setDraggable(draggable) {
    if ("ontouchend" in document) {
        return;
    }
    var options = {
        draggable: draggable, 
        panControl: draggable, 
        scrollwheel: draggable 
    };
    this.map.setOptions(options);
},

zoom_changedまたはidleイベントは、いくつかの理由で実際にはオプションではありません。

  1. このidleイベントは、マップがアイドル状態のときにのみ呼び出され、私が行っていたアニメーションの量では、これは呼び出されませんでした。
  2. 各ステップでのアニメーションは、追跡されたマーカーでマップを再センタリングしたため、zoom_changedイベントはアニメーション フレームの前に再センタリングをリコールします。
  3. アニメーションの量が多いため、中央にパンしないのは、アニメーション フレームを減らしてパフォーマンスを向上させるためです。
于 2012-07-02T23:36:38.137 に答える
2

マップをダブルクリックしたり、マップをホイールでズームしたりする場合、マウスの位置を考慮する必要はないと主張することは可能ですが (マップ上の位置ではなく、マップ オブジェクトを操作しているため)、ピンチ ツー ズームは常にある場所の周りでマップを物理的に引き伸ばしたり押しつぶしたりするため、場所に依存します。その動作を変更することは、明らかに直感的ではありません。

この場合、ユーザーが何が起こっているかを確認できるように、リッスンするzoom_changedidle、マップをパンして再表示する必要があります。

これらのイベントを使用して、デフォルトのダブルクリックまたはマウスホイールの動作を処理することもできるため、ユーザーが通常持っている制御のレベルを変更していることは明らかです

于 2012-06-13T08:07:09.153 に答える