Pertanyaan Menurunkan ulang Beberapa Google Maps Marker Tanpa Repaint On Map


Saya punya penanda yang sangat besar (~ 1.300) yang saya tempatkan di peta di atas garis waktu. Pada dasarnya itu seperti memainkan video di mana selama urutan waktu, spidol ditempatkan menggunakan google.maps.Animation.DROP di peta. Kami memiliki kontrol jenis pemutar video / audio standar yang memungkinkan Anda menavigasi garis waktu: putar / jeda, lewati untuk memulai, lompat ke ujung, dan bilah pemoles untuk bergerak secara acak dalam garis waktu.

Jika saya mulai dengan peta kosong dan garis waktu berhenti di awal dan kemudian melompat ke ujung ada penundaan singkat karena semua objek penanda tersebut dibuat dan kemudian mereka semua jatuh ke peta bersama. Ini baik-baik saja.

Setelah penanda telah ditempatkan dan pengguna bergerak mundur di timeline (ke titik di mana penanda tertentu seharusnya tidak lagi terlihat) saya melakukan marker.setMap(null) dan spidolnya disembunyikan. Dari apa yang saya miliki Baca baca ini adalah cara yang benar untuk menghapus penanda dan itu berhasil.

Masalah besar bermanifestasi jika Anda membuat / meletakkan semua (atau sejumlah besar) penanda, lalu menavigasi kembali ke timeline (sedemikian rupa sehingga sejumlah besar penanda dihapus), dan kemudian lompat ke depan lagi. Ini menciptakan kilatan pin yang buruk di peta yang kemudian menghilang dan tiba-tiba turun dari bagian atas peta.

Seperti yang disebutkan, efek yang benar (pin drop in tanpa muncul di peta sebelumnya) terjadi pertama waktu jepret menurun, tetapi tetes berikutnya menyebabkan perilaku aneh ini. Untuk sejumlah kecil pin itu sangat tak terlihat, tetapi dengan banyak pin itu jauh lebih mengganggu.

Sepertinya harus ada sesuatu dalam keadaan internal penanda itu marker.setMap(null) tidak benar-benar diatur ulang, tapi saya tidak yakin apa itu.

Saya awalnya menciptakan penanda baru yang diperlukan dan kemudian menghancurkannya ketika mereka menghilang, tetapi overhead ini membuat semuanya menjadi lamban. Secara teori saya merasa pendekatan saya harus bekerja di seluruh, tetapi pada dasarnya saya mendapatkan satu tembakan yang bagus dengan efek yang tepat dan pengulangan berperilaku buruk.

Apakah ada yang melihat sesuatu yang saya lakukan salah atau memiliki saran tentang cara membuat ini berperilaku?

Logika yang menambahkan pin, menunjukkan, dan bersembunyi kira-kira sebagai berikut:

Realtime.prototype.placePin = function(ent) {
    var ctxt = this;

    ent.latLng = new google.maps.LatLng(ent.lat, ent.lng);

    ent.marker = new google.maps.Marker({
        position: ent.latLng,
        map: null,
        animation: google.maps.Animation.DROP,
        optimized: false
    });
};

Realtime.prototype.tick = function(force_tick) {
    var ctxt = this;

    if ((!ctxt.playing || ctxt.dragging) && !force_tick) {
        return;
    } else {
        ctxt.time += ctxt.per_tick;
    }
    ctxt.nowDate = new Date(ctxt.time * 1000);

    ctxt.pins_to_drop = [];     
    for (var i = 0, l = ctxt.entries.length; i < l; i++) {
        var ent = ctxt.entries[i];
        var ent_date = new Date(ent.created + ' UTC');
        if (ent_date < ctxt.nowDate) {
            if (!ent.marker || ent.marker.map == null) {
                if (!ent.marker) {
                    ctxt.placePin(ent);
                }
                ctxt.pins_to_drop.push(ent);
            }
        } else {
            if (ent.marker && ent.marker.map != null) {
                ent.marker.setMap(null);
            }
        }
    }

    ctxt.updateUI();

};

Realtime.prototype.updateUI = function() {
    var ctxt = this;

    for (var i = 0, l = ctxt.pins_to_drop.length; i < l; i++) {
        var ent = ctxt.pins_to_drop[i];
        ent.marker.setMap(null);
        ent.marker.setAnimation(google.maps.Animation.DROP);
        ent.marker.setMap(ctxt.map);
    }
};

5
2018-04-28 20:09


asal


Jawaban:


Lihat update biola dan saya tidak yakin apakah itu menyelesaikan masalah Anda, tetapi cara lain untuk sembunyikan / lepaskan spidol adalah dengan menelepon setVisible() penanda sebagai marker.setVisible(boolean). Animasi drop dalam hal ini hanya akan berfungsi untuk pertama kalinya sebagai setVisible() tidak mengaitkan penanda dengan peta lagi karena sudah terkait.


-1
2018-05-06 12:52