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

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

во-первых, проблема с текстом заключается в том, что он перезаписывает, а не заменяет последнюю запись, поэтому через пару минут работы приложения на телефоне вы больше не можете читать числа. --использование 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.";
    }
}

person user2224471    schedule 30.03.2013    source источник
comment
Можете ли вы переформатировать стену текста в абзаце? Потому что так тяжело читать и вникать в вашу проблему.   -  person Hugo Dozois    schedule 31.03.2013
comment
спасибо -- надеюсь, я сделал это более ясным   -  person user2224471    schedule 31.03.2013


Ответы (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.";
            }
        }
    }

}
person Daniel MesSer    schedule 31.03.2013
comment
вы абсолютно правы -- вызывался несколько раз, так что вы тоже решили проблему с массивом. жаль быть новичком в этом. большое спасибо - person user2224471; 31.03.2013