Nativescript位置运行时更新

时间:2017-05-10 16:37:31

标签: javascript lua location nativescript

我是Nativescript的新手(曾经是​​Corona / Lua开发人员),我需要创建一个函数(类似于Lua中的RuntimeEventListener),该函数不断获取用户位置并更新速度和高度的仪表板,例如

我的当前代码仅在按下按钮时获取此信息(这对我正在尝试构建的应用程序类型没有意义)。问题是,如何创建和调用这样的监听器/函数?

我在Javascript编码,下面是我当前的代码:

var Observable = require("data/observable").Observable;
var frames = require("ui/frame");

var orientation = require('nativescript-orientation');
  orientation.enableRotation(); // The screen will  rotate 
  console.log(orientation.getOrientation());  // Returns the enum DeviceOrientation value

var dialogs = require("ui/dialogs");  

// Get geo coordinates
var geolocation = require("nativescript-geolocation");
if (!geolocation.isEnabled()) {
        geolocation.enableLocationRequest();
}
/*
var watchID
watchId = geolocation.watchLocation(
    function (loc) {
        if (loc) {
            console.log("(watchid) Received location: " + loc);
        }
    }, 
    function(e){
        console.log("(watchid) Error: " + e.message);
    }, 
    {desiredAccuracy: 3, updateDistance: 10, minimumUpdateTime : 1000 * 20}); // should update every 20 sec according to google documentation this is not so sure.
*/


    //variables for the dashboard and the Origin 
    var originLoc //holds the lat,long of the starting point
    var originHeading = "NNW"
    var originTime = "0"
    var originDistance = "0"

    var mySpeed = "0"
    var myDuration = "00:00"
    var myDistance = "0"
    var myAltitude = "0";
    var myDirection;

    var butAction = "START" //button action when it starts

var fbMeasurement = "imperial";

//Sets the right heading of the compass (if landscape, subtracts 90 degrees)
function headingCompass(args) {
    var compassHead = "";

    if (args>12 && args<=34) {
        compassHead = "NNE";
    } else if (args>34 && args<=57) {
        compassHead = "NE";
    } else if (args>57 && args<=80) {
        compassHead = "ENE";
    } else if (args>80 && args<=102) {
        compassHead = "E";
    } else if (args>102 && args<=124) {
        compassHead = "ESE";
    } else if (args>124 && args<=147) {
        compassHead = "SE";
    } else if (args>147 && args<=170) {
        compassHead = "SSE";
    } else if (args>170 && args<=192) {
        compassHead = "S";
    } else if (args>192 && args<=215) {
        compassHead = "SSW";
    } else if (args>215 && args<=237) {
        compassHead = "SW";
    } else if (args>237 && args<=260) {
        compassHead = "WSW";
    } else if (args>260 && args<=282) {
        compassHead = "W";
    } else if (args>282 && args<=305) {
        compassHead = "WNW";
    } else if (args>305 && args<=327) {
        compassHead = "NW";
    } else if (args>327 && args<=350) {
        compassHead = "NNW";
    } else {
        compassHead = "N";
    }  
    return compassHead;
}



//Gets current location when app starts
var geolocation = require("nativescript-geolocation");
if (!geolocation.isEnabled()) {
        geolocation.enableLocationRequest();
}
var location = geolocation.getCurrentLocation({desiredAccuracy: 3, updateDistance: 10, maximumAge: 20000, timeout: 20000}).
then(function(loc) {
    if (loc) {
        console.log("Current location is: " + loc);
        originLoc = loc;
        if (fbMeasurement === "imperial") {
            myAltitude = parseInt(loc.altitude * 3.28084);
            mySpeed = (loc.speed * 2.23694).toFixed(1);
        } else {
            mySpeed = loc.speed.toFixed(1);
            myAltitude = parseInt(loc.altitude);
        }
        myDirection = headingCompass(loc.direction)
    }
}, function(e){
    console.log("Error: " + e.message);
});


function createViewModel() {
    var viewModel = new Observable();

    viewModel.originHeading = originHeading;
    viewModel.originTime = originTime;
    viewModel.originDistance = originDistance;

    viewModel.mySpeed = mySpeed;
    viewModel.myDuration = myDuration;
    viewModel.myDistance = myDistance;
    viewModel.myAltitude = myAltitude;

    viewModel.butAction = butAction;


    //STARTs
    var watchid;
    viewModel.onTapStart = function(args) {
        if (butAction==="START") {

            //change button color to RED
            var btn = args.object;
            btn.backgroundColor = "#FF0000";
            //change button text to "STOP"
            this.set("butAction","STOP");
            butAction = "STOP";

            watchId = geolocation.watchLocation(
            function (loc) {
                if (loc) {
                    console.log("Received location: " + loc);

                    if (fbMeasurement === "imperial") {
                        myAltitude = parseInt(loc.altitude * 3.28084);
                        mySpeed = (loc.speed * 2.23694).toFixed(1);
                    } else {
                        mySpeed = loc.speed.toFixed(1);
                        myAltitude = parseInt(loc.altitude);
                    }
                    myDirection = headingCompass(loc.direction);


                }
            }, 
            function(e){
                console.log("Error: " + e.message);
            }, 
            {desiredAccuracy: 3, updateDistance: 10, minimumUpdateTime : 1000 * 1}); // should update every 20 sec according to google documentation this is not so sure.

        } else {
            //change button color to GREEN
            var btn = args.object;
            btn.backgroundColor = "#00FF00";
            //change button text to "START"
            this.set("butAction","START")
            butAction = "START";

            if (watchId) {
                geolocation.clearWatch(watchId);
            }
        }


        this.set("myAltitude",myAltitude);
        this.set("mySpeed",mySpeed);
        this.set("myDistance",myDirection);



    }

    return viewModel;
}

exports.createViewModel = createViewModel;

0 个答案:

没有答案