ApplicationWindow.js文件内容:
//Application Window Component Constructor exports.ApplicationWindow = function() { var geo = require('geo'); //create object instance var self = Ti.UI.createWindow({ backgroundColor:'#fff', fullscreen: false, exitOnClose: true }); // create UI components var view = Ti.UI.createView({ backgroundColor: '#800', height: '50dp', top: 0 }); var textfield = Ti.UI.createTextField({ height: '40dp', top: '5dp', left: '5dp', right: '50dp', style: Ti.UI.INPUT_BORDERSTYLE_ROUNDED, hintText: 'Enter an address', backgroundColor: '#fff', paddingLeft: '5dp' }); var button = Ti.UI.createButton({ title: '+', font: { fontSize: '20dp', fontWeight: 'bold' }, top: '5dp', height: '40dp', width: '40dp', right: '5dp' }); var mapview; //Window打开加载事件的使用 // add map after window opens self.addEventListener('open', function() { // Make sure we only add the map once if (mapview !== undefined) { return; } mapview = Titanium.Map.createView({ mapType: Titanium.Map.STANDARD_TYPE, region: { latitude: geo.LATITUDE_BASE, longitude: geo.LONGITUDE_BASE, latitudeDelta: 0.1, longitudeDelta: 0.1 }, animate:true, regionFit:true, userLocation:false, top: '50dp' }); // Add initial annotation mapview.addAnnotation(Ti.Map.createAnnotation({ animate: true, pincolor: Titanium.Map.ANNOTATION_RED, title: 'Appcelerator', latitude: geo.LATITUDE_BASE, longitude: geo.LONGITUDE_BASE, leftButton: '/images/delete.png' })); // Handle all map annotation clicks mapview.addEventListener('click', function(e) { if (e.annotation && (e.clicksource === 'leftButton' || e.clicksource == 'leftPane')) { mapview.removeAnnotation(e.annotation); } }); self.add(mapview); }); // Execute forward geocode on button click button.addEventListener('click', function() { textfield.blur(); geo.forwardGeocode(textfield.value, function(geodata) { mapview.addAnnotation(Ti.Map.createAnnotation({ animate: true, pincolor: Titanium.Map.ANNOTATION_RED, title: geodata.title, latitude: geodata.coords.latitude, longitude: geodata.coords.longitude, leftButton: '/images/delete.png' })); mapview.setLocation({ latitude: geodata.coords.latitude, longitude: geodata.coords.longitude, latitudeDelta: 1, longitudeDelta: 1 }); }); }); // assemble view hierarchy view.add(textfield); view.add(button); self.add(view); return self; };
geo.js
var GOOGLE_BASE_URL = 'http://maps.googleapis.com/maps/geo?output=json&q='; var ERROR_MESSAGE = 'There was an error geocoding. Please try again.'; exports.LATITUDE_BASE = 37.389569; exports.LONGITUDE_BASE = -122.050212; var GeoData = function(title, latitude, longitude) { this.title = title; this.coords = { latitude: latitude, longitude: longitude }; }; //外部暴露的方法 exports.forwardGeocode = function(address, callback) { if (Ti.Platform.osname === 'mobileweb') { forwardGeocodeWeb(address, callback); } else { forwardGeocodeNative(address, callback); } }; //本地通过HttpClient方式访问 var forwardGeocodeNative = function(address, callback) { var xhr = Titanium.Network.createHTTPClient(); xhr.open('GET', GOOGLE_BASE_URL + address); xhr.onload = function() { var json = JSON.parse(this.responseText); if (!json.Placemark || !json.Placemark[0].Point || !json.Placemark[0].Point.coordinates) { alert('Unable to geocode the address'); return; } callback(new GeoData( address, json.Placemark[0].Point.coordinates[1], json.Placemark[0].Point.coordinates[0] )); }; xhr.onerror = function(e) { Ti.API.error(e.error); alert(ERROR_MESSAGE); }; xhr.send(); }; //Web访问的方式 var forwardGeocodeWeb = function(address, callback) { var geocoder = new google.maps.Geocoder(); if (geocoder) { geocoder.geocode({ 'address': address }, function (results, status) { if (status == google.maps.GeocoderStatus.OK) { callback(new GeoData( address, results[0].geometry.location.Ua, results[0].geometry.location.Va )); } else { Ti.API.error(status); alert(ERROR_MESSAGE); } }); } else { alert('Google Maps Geocoder not supported'); } };