.appendText пишет поверх последнего текста, не заменяя его в примере GeolocationEvent.UPDATE

Новичок в actionscript и просмотр примеров GeolocationEvent.UPDATE, с неожиданными результатами с.appendText() и array.push - я не знал, могут ли они оба быть просто телефоном, не поспевая за обновлениями?

Во-первых, проблема в тексте заключается в том, что он перезаписывает, а не заменяет последнюю запись, поэтому после пары минут работы приложения на телефоне вы больше не можете читать цифры. --using this.removeChild() и затем addChild() пытались заставить его удалить последнюю запись перед повторной записью.

и затем, во-вторых, проблема с массивом состоит в том, что он выводит случайные числа.length в trace() - длина выглядит как иногда сбрасываемая до 2, прежде чем снова считать, и считает до, казалось бы, случайных чисел. Я знаю, что не хочу накладных расходов на массив в окончательной версии, но я пытаюсь понять, почему он не работает.

Я прокомментировал разные вещи, которые я пробовал - извините, если я пропустил что-то базовое здесь

var format:TextFormat = new TextFormat();
    format.color = 0xff0066;
    format.font = "Lucida Console";
    format.size = 20;
var fl_GeolocationDisplay:TextField = new TextField();
    fl_GeolocationDisplay.defaultTextFormat = format;   
    fl_GeolocationDisplay.x = 10; 
    fl_GeolocationDisplay.y = 20;
    fl_GeolocationDisplay.selectable = false;   
    fl_GeolocationDisplay.autoSize = TextFieldAutoSize.LEFT;
//fl_GeolocationDisplay.text = "Geolocation is not responding. Verify the device's     location settings.";
fl_GeolocationDisplay.text = " ";
addChild(fl_GeolocationDisplay);

var gpsArray:Array = [42.09646417];

if(!Geolocation.isSupported)
{
    fl_GeolocationDisplay.text = "Geolocation is not supported on this device.";
}
else
{
    var fl_Geolocation:Geolocation = new Geolocation();
    fl_Geolocation.setRequestedUpdateInterval(60000); //android overrides     setRequestedUpdateInterval()
    fl_Geolocation.addEventListener(GeolocationEvent.UPDATE, fl_UpdateGeolocation);
    fl_Geolocation.addEventListener(StatusEvent.STATUS, gpsStatusHandler);
}

function fl_UpdateGeolocation(event:GeolocationEvent):void
{
    //gpsArray.push(event.latitude);
    //gpsArray[gpsArray.length] = event.latitude;
    gpsArray.unshift(event.latitude);
    var speed:Number = event.speed * 2.23693629; 
    if (gpsArray[gpsArray.length - 2] != gpsArray[gpsArray.length - 1]) 
    {       
        trace(gpsArray.length + "|" + gpsArray[gpsArray.length - 2] + "|" +     gpsArray[gpsArray.length - 1]);
        trace(gpsArray[1] + "|" + gpsArray[0]);
        trace(gpsArray[gpsArray.length - 2] - gpsArray[gpsArray.length - 1]);
    }

    //this.removeChild(fl_GeolocationDisplay);
    fl_GeolocationDisplay.parent.removeChild(fl_GeolocationDisplay);
    //fl_GeolocationDisplay = null; //TypeError: Error #2007: Parameter child must be non-null.
    addChild(fl_GeolocationDisplay);
    fl_GeolocationDisplay.text = (event.latitude.toString() + " | " +     event.timestamp.toString());
    //fl_GeolocationDisplay.text = (event.latitude.toString() + "\n");
    //fl_GeolocationDisplay.appendText(event.latitude.toString() + "\n");
    //fl_GeolocationDisplay.appendText(event.longitude.toString() + "\n");
}

function gpsStatusHandler(event:StatusEvent):void {
    if (fl_Geolocation.muted) {
        fl_GeolocationDisplay.text = "Please verify the device's location     settings.";
    }
}

1 ответ

Решение

Я действительно не могу понять, что вы пытаетесь сделать, я имею в виду, что вы говорите одно, а ваш код, кажется, говорит что-то другое.

Существует также серьезная проблема относительно того, где расположены различные фрагменты кода? Кажется, что верхняя часть находится внутри конструктора. И тогда в нижней части есть свои функции? Если это так, убедитесь, что конструктор не запускается несколько раз (что, по-видимому, является проблемой и объясняет, почему элементы "перезаписываются" друг на друга).

Также в вашем вопросе говорится о appendText, но кажется, что вы хотите заменить текст внутри текстового поля? AppendText добавит дополнительный текст внутри этого текстового поля.

В любом случае, я сделал реализацию из вашего кода, которая получает "долготу | широту" из события обновления и затем добавляет их в текстовое поле на новой строке. Может быть, это то, что вы хотели сделать? Я закомментировал массив gps, так как понятия не имел, чего вы пытались достичь, выполнив это:

package {
    import flash.events.GeolocationEvent;
    import flash.events.StatusEvent;
    import flash.sensors.Geolocation;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;


    public class Foobar extends MovieClip {
        var gpsArray:Array = [42.09646417];
        var format:TextFormat = new TextFormat();
        var fl_GeolocationDisplay:TextField = new TextField();
        var fl_Geolocation:Geolocation = new Geolocation();

        public function Foobar() {
            format.color = 0xff0066;
            format.font = "Lucida Console";
            format.size = 20;
            fl_GeolocationDisplay.defaultTextFormat = format;
            fl_GeolocationDisplay.x = 10;
            fl_GeolocationDisplay.y = 20;
            fl_GeolocationDisplay.selectable = false;
            fl_GeolocationDisplay.autoSize = TextFieldAutoSize.LEFT;
            //fl_GeolocationDisplay.text = "Geolocation is not responding. Verify the device's     location settings.";
            fl_GeolocationDisplay.text = " ";
            addChild(fl_GeolocationDisplay);


            if(!Geolocation.isSupported) {
                trace("unsupported");
                fl_GeolocationDisplay.text = "Geolocation is not supported on this device.";
            } else {
                trace("supported");
                fl_Geolocation.setRequestedUpdateInterval(500); //android overrides     setRequestedUpdateInterval()
                fl_Geolocation.addEventListener(GeolocationEvent.UPDATE, fl_UpdateGeolocation);
                fl_Geolocation.addEventListener(StatusEvent.STATUS, gpsStatusHandler);
            }
        }

        function fl_UpdateGeolocation(event:GeolocationEvent):void {
            /*gpsArray.unshift(event.latitude);
            var speed:Number = event.speed * 2.23693629;
            if (gpsArray[gpsArray.length - 2] != gpsArray[gpsArray.length - 1]) {
                trace(gpsArray.length + "|" + gpsArray[gpsArray.length - 2] + "|" +     gpsArray[gpsArray.length - 1]);
                trace(gpsArray[1] + "|" + gpsArray[0]);
                trace(gpsArray[gpsArray.length - 2] - gpsArray[gpsArray.length - 1]);
            }*/

            fl_GeolocationDisplay.appendText(event.latitude.toString() + "|" + event.longitude.toString() + "\n");
        }

        function gpsStatusHandler(event:StatusEvent):void {
            if (fl_Geolocation.muted) {
                fl_GeolocationDisplay.text = "Please verify the device's location     settings.";
            }
        }
    }

}
Другие вопросы по тегам