最近更新SDK,結果發現之前測試的Map v2專案執行時都產生Unable to resolve superclass of L...問題而異常終止,解決方式如下:
1. 開啟專案屬性視窗
2. 點選Java Build Path節點
3. 勾選Order and Export頁籤下的"Android Private Libraries"項目,
2013年7月9日 星期二
2013年5月10日 星期五
Android程式設計 - Google Maps API v2在地圖上繪圖
程式中可在Google Map上繪製連續線、圓形及多邊形,且繪製的幾何圖形會自動隨地圖縮放調整比例。
GoogleMap.addPolyline()方法用來在地圖上描繪連續線段。
GoogleMap.addPolygon()方法用來在地圖上描繪多邊形。
GoogleMap.addCircle()方法用來在地圖上描繪圓形。
例如:
GoogleMap.addPolyline()方法用來在地圖上描繪連續線段。
GoogleMap.addPolygon()方法用來在地圖上描繪多邊形。
GoogleMap.addCircle()方法用來在地圖上描繪圓形。
例如:
m_map =
((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
LatLng p1 = new LatLng(23.95616, 120.68509);
LatLng p2 = new LatLng(23.95666, 120.68585);
LatLng p3 = new LatLng(23.95836, 120.68732);
m_map.addPolyline(new PolylineOptions().
add(p1, p2, p3).
width(5).
color(Color.LTGRAY).
geodesic(true));
m_map.addCircle(new CircleOptions().
center(p1).
radius(10).
strokeWidth(5).
strokeColor(Color.RED));
m_map.addCircle(new CircleOptions().
center(p2).
radius(10).
strokeWidth(5).
strokeColor(Color.RED));
m_map.addCircle(new CircleOptions().
center(p3).
radius(10).
strokeWidth(5).
strokeColor(Color.RED));
2013年5月9日 星期四
Android程式設計 - Google Maps API v2自訂地標訊息視窗
預設的地標訊息title及snippet都只能顯示單行文字,當文字訊息過長時,後面的部份就只顯示「…」而看不到完整的文字內容。
要自訂地標訊息視窗樣式,首先必須為地標訊息視窗設計所需的版面配置,例如使用一個圖示與二個文字方塊做為地標訊息視窗版面。
要自訂地標訊息視窗樣式,首先必須為地標訊息視窗設計所需的版面配置,例如使用一個圖示與二個文字方塊做為地標訊息視窗版面。
接著為GoogleMap設計一個Adapter類別,在該類別的getInfoContents()方法中,將所要顯示的地標title及snippet內容設定到自訂的地標訊息視窗版面元件中。
class
MyInfoWindowAdapter implements
InfoWindowAdapter {
@Override
public View getInfoContents(Marker marker) {
// 依指定layout檔,建立地標訊息視窗View物件
View infoWindow = getLayoutInflater().inflate(R.layout.my_infowindow, null);
// 顯示地標title
TextView title =
((TextView)infoWindow.findViewById(R.id.txtTitle));
title.setText(marker.getTitle());
// 顯示地標snippet
TextView
snippet = ((TextView)infoWindow.findViewById(R.id.txtSnippet));
snippet.setText(marker.getSnippet());
return infoWindow;
}
...
}
最後設定GoogleMap使用自訂的MyInfoWindowAdapter物件做為地標訊息視窗轉接器。
m_map.setInfoWindowAdapter(new
MyInfoWindowAdapter());2013年5月7日 星期二
Android程式設計 - Google Maps API v2 可拖曳地圖地標
若要允許使用者移動地圖上的地標,則地標之draggable屬性必須設定為true,並實作GoogleMap之OnMarkerDrag事件監聽器。
OnMarkerDrag事件監聽器有三個回呼方法,onMarkerDragStart()、onMarkerDrag()及onMarkerDragEnd(),如果沒有特別需求,就維持原程式框架即可。
使用者只要按住地標一段時間,地標就會浮起,之後就可開始拖曳調整地標位置。
OnMarkerDrag事件監聽器有三個回呼方法,onMarkerDragStart()、onMarkerDrag()及onMarkerDragEnd(),如果沒有特別需求,就維持原程式框架即可。
使用者只要按住地標一段時間,地標就會浮起,之後就可開始拖曳調整地標位置。
m_map = ((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
MarkerOptions marker2 = new MarkerOptions().
position(new LatLng(23.95616, 120.68509)).
title("椰林大道荷花香").
snippet("休閒散心的景觀步道,兩側高大的大王椰子樹,樹下緊傍著荷花相伴").
draggable(true).
icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker2));
m_map.addMarker(marker2);
m_map.setOnMarkerDragListener(new OnMarkerDragListener(){
@Override
public void
onMarkerDrag(Marker arg0) {}
@Override
public void
onMarkerDragEnd(Marker arg0) {}
@Override
public void
onMarkerDragStart(Marker arg0) {}
});
Android程式設計 - Google Maps API v2 地圖地標
地圖標記方便我們在地圖的特定位置加上記號,讓重要地標在地圖上一目了然。
程式中可使用GoogleMap.addMarker()方法在地圖上加上地標,當使用者點擊地標時即會顯示地標中的訊息。
程式中可使用GoogleMap.addMarker()方法在地圖上加上地標,當使用者點擊地標時即會顯示地標中的訊息。
l Marker GoogleMap.addMarker(MarkerOptions options)
依據MarkerOptions物件內容,在地圖加上地標。
options MarkerOptions物件,用來描述地標內容。
地標內容是以MarkerOptions物件來描述,包括以下屬性:
position LatLng物件,放置地標的地圖座標,此為必要項。
title 地標名稱,當使用者點擊地標時,會開啟訊息視窗顯示標題。
snippet 地標之附加說明文字,會顯示在標題文字下方。
draggable 是否允許使用者拖曳地標,預設值為false。
visible 是否顯示地標,預設值為true。
anchor 地標圖示與position座標值位置之對齊方式,預設是將地標圖示下緣中央貼齊position座標值。
icon BitmapDescriptor物件,用來描述做為地標圖案之圖示。
例如下列程式碼在地圖中加入1個地標:
m_map = ((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
MarkerOptions marker1 = new
MarkerOptions().
position(new
LatLng(23.95666, 120.68585)).
title("中興新村牌樓").
snippet("雙十造型牌樓,是中興新村的門戶景觀,也是進入中興新村的指標").
icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_marker));
m_map.addMarker(marker1);
2013年5月3日 星期五
Android程式設計 - Google Maps API v2 地圖定位
使用My location圖層是最簡便的定位方式,其概念像是在地圖上覆蓋透明圖層,當我們啟用my-location圖層後,定位點內容自然會疊覆到地圖上。
程式中可使用GoogleMap.setMyLocationEnabled()方法來開啟或關閉My location圖層。例如:
GoogleMap m_map =
((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
m_map.setMyLocationEnabled(true);
2013年5月2日 星期四
Android程式設計 - Google Maps API v2 變更地圖檢視模式
GoogleMap物件支援一般地圖(就是大家常用的道路地圖)、衛星地圖、及地形圖,預設是顯示道路地圖,程式中可使用setMapType ()來設定顯示模式。
l void GoogleMap.setMapType (int type)
依指定之LatLng座標物件及地圖縮放值,建立CameraUpdate物件。
type 地圖顯示模式代碼,有效設定值如下:
GoogleMap.MAP_TYPE_NORMAL 道路地圖。
GoogleMap.MAP_TYPE_SATELLITE 衛星空照圖。
GoogleMap.MAP_TYPE_TERRAIN 地形圖。
GoogleMap.MAP_TYPE_HYBRID 道路地圖混合空照圖。
例如下列程式碼設定顯示地形圖:
GoogleMap map =
((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
Android程式設計 - Google Maps API v2 調整地圖中心點
地圖座標是使用LatLng物件來表示,LatLng建構子第一個參數表示緯度值,第二個參數表示經度值。例如:
LatLng nkut = new LatLng(23.97918, 120.69686);
程式中可直接使用GoogleMap物件之moveCamera(CameraUpdate update)方法或animateCamera(CameraUpdate update)方法來移動地圖鏡頭到指定座標點,差別在於animateCamera()會有地圖移動效果。
在上述方法中,update為地圖鏡頭動作物件,必須使用CameraUpdateFactory類別建構CameraUpdate物件。最簡單的方式是使用CameraUpdateFactory.newLatLng (LatLng latLng),例如:
LatLng nkut = new LatLng(23.97918, 120.69686);
程式中可直接使用GoogleMap物件之moveCamera(CameraUpdate update)方法或animateCamera(CameraUpdate update)方法來移動地圖鏡頭到指定座標點,差別在於animateCamera()會有地圖移動效果。
在上述方法中,update為地圖鏡頭動作物件,必須使用CameraUpdateFactory類別建構CameraUpdate物件。最簡單的方式是使用CameraUpdateFactory.newLatLng (LatLng latLng),例如:
GoogleMap map =
((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
LatLng nkut = new
LatLng(23.97918, 120.69686);
map.moveCamera(CameraUpdateFactory.newLatLng(nkut));
CameraUpdateFactory.newLatLngZoom()方法除了指定地圖中心LatLng座標,還同時設定地圖縮放等級。例如:
GoogleMap map =
((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
LatLng nkut = new
LatLng(23.97918, 120.696867);
2012年12月25日 星期二
Android程式設計 - Google Maps API v2應用程式基本架構
1. 開啟Android SDK Manager,確認已安裝Google Play services。
2. 將google-play-services_lib專案匯入到工作區。在專案開發過程google-play-services_lib專案必須維持開啟狀態。
3. 建立Android專案。
4. 將google-play-services_lib加到Google Maps API v2應用程式專案。
5. 使用debug.keystore的SHA1碼及專案套件名稱(workshop.mapapiv2)到https://code.google.com/apis/console/官網申請Google Maps API v2 key。
6. 開啟專案之AndroidManifest.xml檔,在 元素之結束標籤(
)前加入以下宣告。其中apiv2_key需置換為Google Maps API v2 key。
2. 將google-play-services_lib專案匯入到工作區。在專案開發過程google-play-services_lib專案必須維持開啟狀態。
3. 建立Android專案。
4. 將google-play-services_lib加到Google Maps API v2應用程式專案。
5. 使用debug.keystore的SHA1碼及專案套件名稱(workshop.mapapiv2)到https://code.google.com/apis/console/官網申請Google Maps API v2 key。
6. 開啟專案之AndroidManifest.xml檔,在
)前加入以下宣告。其中apiv2_key需置換為Google Maps API v2 key。
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="apiv2_key" />
7. 在AndroidManifest.xml檔 元素之前加入以下宣告,其中your_package_name需置換為自己的App專案套件名稱。
<permission
android:name="your_package_name.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission
android:name="your_package_name.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission
android:name=
"com.google.android.providers.gsf.permission.READ_GSERVICES"/>
8. 在AndroidManifest.xml檔 元素之前加入以下 宣告。
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
9. 開啟專案版面配置檔(activity_main.xml),移除預設的<TextView> ,加入以下 元件。如果Minimum Required SDK是指定為API 12之後版本, 之class屬性值可使用”com.google.android.gms.maps. MapFragment”。
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"/>
10. 編輯專案程式檔(MainActivity.java)。將MainActivity改為繼承自FragmentActivity。注意!如果Minimum
Required SDK是指定為API 12之後版本,且版面配置檔 之class屬性值是使用”com.google.android.gms.maps. MapFragment”時,則MainActivity要直接繼承Activity。
public class MainActivity extends FragmentActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
訂閱:
文章 (Atom)




