Android開原始碼解讀の地圖照片應用Panoramio的實現詳解(三)

來源:互聯網
上載者:User

本文介紹程式主介面的實現,對應的檔案是Panoramio.java,主介面提供給使用者從地圖上選擇搜尋地區的功能,因此,直接從MapActivity繼承,並實現OnClickListener介面。這樣一來,這個類的初始架構如下代碼所示:

import com.google.android.maps.MapActivity;</p><p>import android.os.Bundle;<br />import android.view.View;<br />import android.view.View.OnClickListener;</p><p>public class MainActivity extends MapActivity implements OnClickListener {<br /> /** Called when the activity is first created. */<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> }</p><p>@Override<br />//為了統計目的,地圖伺服器需要知道我們的MapActivity是否顯示路線資訊,例如行車方向等<br />protected boolean isRouteDisplayed() {<br />return false;<br />}</p><p>public void onClick(View arg0) {<br />// TODO Auto-generated method stub</p><p>}<br />}重溫下程式介面,如:


對照著,布局檔案main.xml也就一目瞭然,結合採用線性布局和幀布局,如下所示:(注意,picture_frame.9.png是一張9-patch圖片)

<?xml version="1.0" encoding="utf-8"?></p><p><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><FrameLayout<br />android:layout_width="fill_parent"<br /> android:layout_height="0dip"<br /> android:layout_weight="1"<br /> android:padding="10dip"></p><p><FrameLayout<br />android:id="@+id/frame"<br />android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> android:background="@drawable/picture_frame"<br /> /><br /></FrameLayout> </p><p><Button<br /> android:id="@+id/go"<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:layout_gravity="center_horizontal"</p><p> android:text="@string/go"<br /> android:minWidth="150dip"<br /> android:layout_marginBottom="2dip"<br /> /></p><p></LinearLayout>

下面是Panoramio.java的代碼,注釋很清楚了,這裡就不多說了:

package com.google.android.panoramio;</p><p>import com.google.android.maps.GeoPoint;<br />import com.google.android.maps.MapActivity;<br />import com.google.android.maps.MapView;<br />import com.google.android.maps.MyLocationOverlay;</p><p>import android.content.Intent;<br />import android.os.Bundle;<br />import android.view.Gravity;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.view.ViewGroup.LayoutParams;<br />import android.widget.Button;<br />import android.widget.FrameLayout;</p><p>/**<br /> * 該Activity提供MapView給使用者選擇周邊圖片搜尋地區<br /> *<br /> */<br />public class Panoramio extends MapActivity implements OnClickListener {<br /> private MapView mMapView; //顯示地圖的map<br /> private MyLocationOverlay mMyLocationOverlay; //在地圖上畫出使用者目前位置的Overlay<br /> private ImageManager mImageManager; //負責從Panoramio伺服器下載並解析指定地區的圖片資源</p><p> public static final int MILLION = 1000000;</p><p> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);</p><p> setContentView(R.layout.main);</p><p> mImageManager = ImageManager.getInstance(this); //ImageManager是一個單例類</p><p> FrameLayout frame = (FrameLayout) findViewById(R.id.frame);<br /> Button goButton = (Button) findViewById(R.id.go);<br /> goButton.setOnClickListener(this);</p><p> //將MapView加入到FrameLayout中,Panoramio_DummyAPIKey是Google地圖API密鑰<br /> mMapView = new MapView(this, "Panoramio_DummyAPIKey");<br /> frame.addView(mMapView,<br /> new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));</p><p> // 建立Overlay顯示使用者當前位置<br /> mMyLocationOverlay = new MyLocationOverlay(this, mMapView);<br /> //<br /> mMyLocationOverlay.runOnFirstFix(new Runnable() { public void run() {<br /> mMapView.getController().animateTo(mMyLocationOverlay.getMyLocation());<br /> }});</p><p> mMapView.getOverlays().add(mMyLocationOverlay); //將我們的LocationOverlay加入Overlay鏈表中<br /> mMapView.getController().setZoom(15); //設定縮放層級(1~21)<br /> mMapView.setClickable(true);<br /> mMapView.setEnabled(true);<br /> mMapView.setSatellite(true);</p><p> addZoomControls(frame);<br /> }</p><p> @Override<br /> protected void onResume() {<br /> super.onResume();<br /> mMyLocationOverlay.enableMyLocation();<br /> }</p><p> @Override<br /> protected void onStop() {<br /> mMyLocationOverlay.disableMyLocation();<br /> super.onStop();<br /> }</p><p> /**<br /> * 給指定的FrameLayout添加縮放控制<br /> */<br /> private void addZoomControls(FrameLayout frame) {<br /> //擷取MapView的縮放控制視圖<br /> View zoomControls = mMapView.getZoomControls();</p><p> //將縮放控制視圖添加到FrameLayout的底部<br /> FrameLayout.LayoutParams p =<br /> new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,<br /> LayoutParams.WRAP_CONTENT, Gravity.BOTTOM + Gravity.CENTER_HORIZONTAL);<br /> frame.addView(zoomControls, p);<br /> }</p><p> @Override<br /> protected boolean isRouteDisplayed() {<br /> return false; //不顯示路線資訊<br /> }</p><p> /**<br /> * 點擊搜尋按鈕的事件響應<br /> */<br /> public void onClick(View view) {<br /> // 擷取搜尋地區的經緯度資訊<br /> int latHalfSpan = mMapView.getLatitudeSpan() >> 1; //緯度跨度的一半(當前選中搜尋地區的緯度半徑),十進位形式度數*1000000<br /> int longHalfSpan = mMapView.getLongitudeSpan() >> 1; //經度跨度的一半(當前選中搜尋地區的經度半徑),十進位形式度數*1000000</p><p> //儲存當前地圖的位置資訊,以便後續以相同位置顯示<br /> GeoPoint center = mMapView.getMapCenter();<br /> int zoom = mMapView.getZoomLevel(); //縮放層級<br /> int latitudeE6 = center.getLatitudeE6(); //中心點的緯度*1E6(1E6=1000000)<br /> int longitudeE6 = center.getLongitudeE6();//中心點的經度*1E6(1E6=1000000)</p><p> //構造Intent,傳遞給ImageList.class<br /> Intent i = new Intent(this, ImageList.class);<br /> i.putExtra(ImageManager.ZOOM_EXTRA, zoom);<br /> i.putExtra(ImageManager.LATITUDE_E6_EXTRA, latitudeE6);<br /> i.putExtra(ImageManager.LONGITUDE_E6_EXTRA, longitudeE6);</p><p> //計算搜尋地區中經度和緯度的最小值和最大值(搜尋地區是一個圓)<br /> float minLong = ((float) (longitudeE6 - longHalfSpan)) / MILLION;<br /> float maxLong = ((float) (longitudeE6 + longHalfSpan)) / MILLION;</p><p> float minLat = ((float) (latitudeE6 - latHalfSpan)) / MILLION;<br /> float maxLat = ((float) (latitudeE6 + latHalfSpan)) / MILLION;</p><p> mImageManager.clear(); //清空上次下載的內容</p><p> // 開始下載搜尋地區內的圖片資訊資源<br /> mImageManager.load(minLong, maxLong, minLat, maxLat);</p><p> //跳轉到圖片列表介面<br /> startActivity(i);<br /> }<br />}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.