Days26 百度地圖(一)

(一)配置環境步驟:
官網幫助:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
1、新建工程
2、往libs裏導包
3、在application中添加開發密鑰

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="開發者 key" />  
</application>

value爲在百度開發平臺上輸入SHA1和報名後獲得的密鑰
獲取SHA1步驟:
a、eclipse下:
windows–preference–android–build
b、studio下
terminal—->cd 到debug.keystore文件目錄下(如果studio不在
c盤,從安裝目錄轉不到此文件目錄,此時可以在dos下cd到此目錄)–>輸入keytool命令(keytool -list -v -keystore debug.keystore)–>輸入口令:android(只管輸入,不顯示)–>找到SHA1
注意:
(1)把項目下的debug.keyStore刪除,兩個勾取消
(2)build.gradle下的singingConfigs注掉(在SdkVersion下面)
包名:
爲Manifes下的package值
4、添加權限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

5、在佈局xml文件中添加地圖控件;

<com.baidu.mapapi.map.MapView  
    android:id="@+id/bmapView"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:clickable="true" />

6、在應用程序創建時初始化 SDK引用的Context 全局變量:

public class MainActivity extends Activity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);   
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext  
        //注意該方法要再setContentView方法之前實現  
        SDKInitializer.initialize(getApplicationContext());  
        setContentView(R.layout.activity_main);  
    }  
}

注意:在SDK各功能組件使用之前都需要調用
SDKInitializer.initialize(getApplicationContext());,因此我們建議該方法放在Application的初始化方法中**
(1)寫一個MapDataApp類繼承Application,
在onCreate方法裏寫該方法

public class MapDataApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        // 注意該方法要再setContentView方法之前實現
        SDKInitializer.initialize(getApplicationContext());
    }

}

(2)給Manifest文件下的application添加name屬性

 <application
        android:name="com.sign.days26baidumapwork.MapDataApp"

備註:
所用到的類:
(1)MapView 一個顯示地圖的視圖(View)。它負責從服務端獲取地圖數據。它將會捕捉屏幕觸控手勢事件。 使用這個類必須按照它的生命週期進行操控,你必須參照以下方法onCreate(Bundle)、 onResume()、onPause()、onDestroy()。等聲明週期函數。在使用地圖組件之前請確保已經調用了 SDKInitializer.initialize(Context) 函數以提供全局 Context 信息。
(2)BaiduMap 定義 BaiduMap 地圖對象的操作方法與接口
(3)MapStatus 定義地圖狀態 如(overlook 俯視角度;zoom 縮放倍距; rotate 旋轉角度)
(4)BaiduMapOptions MapView初始化選項
(5)SupportMapFragment 管理地圖生命週期 方法: newInstance(BaiduMapOptions options)根據給定的百度地圖選項創建一個SupportMapFragment 實例
(6)
MapStatusUpdate 描述地圖狀態將要發生的變化
MapStatusUpdateFactory 生成地圖狀態將要發生的變化
MapStatusUpdate latlng = MapStatusUpdateFactory.newLatLng(ll);
fm.getBaiduMap().setMapStatus(latlng);
(7)OverlayOptions 地圖覆蓋物選型基類
Direct Known Subclasses:
ArcOptions, CircleOptions, DotOptions, GroundOverlayOptions, MarkerOptions, PolygonOptions, PolylineOptions, TextOptions
用於在地圖上添加覆蓋物,並設置覆蓋物的相關屬性
(8)class Stroke 邊框類,可以給圓、多邊形設置一個邊框
構造函數 int strokeWidth 邊框的寬度, 單位:像素, int color 邊框的顏色
(9)infoWindow 在地圖中顯示一個信息窗口,可以設置一個View作爲該窗口的內容,也可以設置一個 BitmapDescriptor 作爲該窗口的內容。
構造方法參數:view - InfoWindow 展示的 view;position - InfoWindow 顯示的地理位置;yOffset - InfoWindow Y 軸偏移量(方向 +向下,-向上)
(二)設置WelcomeActivity
開始界面顯示一個ListView,通過點擊ListView的條目,跳轉到不同的Activity

public class WelcomeActivity extends Activity {

    private ListView lvShow = null;

    private BaiduDemo[] baiduDemos = new BaiduDemo[] {
            new BaiduDemo("sdk Demo", MainActivity.class),
            new BaiduDemo("fragmentMap", FragmentMapActivity.class),
            new BaiduDemo("multimap",MultiMapActivity.class),
            new BaiduDemo("overlay",OverlayActivity.class)};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);

        initView();

        setListener();

        MyAdapter adapter = new MyAdapter();

        lvShow.setAdapter(adapter);
    }

    private void setListener() {
        lvShow.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Intent intent = new Intent();
                intent.setClass(WelcomeActivity.this, baiduDemos[position].cls);

                startActivity(intent);
            }
        });
    }

    private void initView() {
        lvShow = (ListView) findViewById(R.id.lvShow);
    }

    class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return baiduDemos.length;
        }

        @Override
        public Object getItem(int position) {
            return baiduDemos[position];
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = LayoutInflater.from(WelcomeActivity.this).inflate(
                    R.layout.list_item, parent, false);

            TextView txtTitle = (TextView) convertView
                    .findViewById(R.id.txtTitle);

            txtTitle.setText(baiduDemos[position].title);

            return convertView;
        }
    }

    class BaiduDemo {
        String title;
        Class<? extends Activity> cls;

        public BaiduDemo(String title, Class<? extends Activity> cls) {
            super();
            this.title = title;
            this.cls = cls;
        }
    }

}

(三)基礎地圖

public class MainActivity extends Activity {

    MapView mMapView = null;
    private BaiduMap mBaiduMap = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        // 注意該方法要再setContentView方法之前實現
        // SDKInitializer.initialize(getApplicationContext());

        setContentView(R.layout.activity_main);

        // 獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);

        mBaiduMap = mMapView.getMap();

        // 普通地圖
         mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

        // 衛星地圖
        // mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

        // 空白地圖,基礎地圖瓦片將不會被渲染。在地圖類型中設置爲NONE,將不會使用流量下載基礎地圖瓦片圖層。
        // 使用場景:與瓦片圖層一起使用,節省流量,提升自定義瓦片圖下載速度。
//      mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
        mMapView.onPause();
    }

}

(四)FragmentMapActivity

public class FragmentMapActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_map);

        FragmentManager manager = getSupportFragmentManager();

//      MapStatus  定義地圖的狀態,overlook 俯視角度;zoom 縮放倍距; rotate 旋轉角度
        MapStatus status = new MapStatus.Builder().overlook(45).zoom(21)
                .rotate(0).build();

//      BaiduMapOptions  MapView初始化選項
        BaiduMapOptions options = new BaiduMapOptions().mapStatus(status);

//      通過BaiduMapOptions獲得一個SupportMapFragment對象
        Fragment fragment = SupportMapFragment.newInstance(options);

        manager.beginTransaction().add(R.id.rl,fragment).commit();
    }
}

(五)多地圖展示

public class MultiMapActivity extends FragmentActivity {

    // LatLng地理座標基本數據結構
    private static final LatLng GEO_BEIJING = new LatLng(39.945, 116.404);
    private static final LatLng GEO_SHANGHAI = new LatLng(31.227, 121.481);
    private static final LatLng GEO_XIAN = new LatLng(34.2656790000,
            108.9534590000);
    private static final LatLng GEO_SHENGZHENG = new LatLng(22.560, 114.064);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_multi_map);

        initView();
    }

    private void initView() {
        FragmentManager manager = getSupportFragmentManager();

        // SupportMapFragment fmBeijing = (SupportMapFragment)
        // manager.findFragmentById(R.id.fmBeijing);
        //
        // MapStatusUpdate latlngBeijing =
        // MapStatusUpdateFactory.newLatLng(GEO_BEIJING);
        //
        // fmBeijing.getBaiduMap().setMapStatus(latlngBeijing);
        setMapView(manager,R.id.fmBeijing,GEO_BEIJING);
        setMapView(manager,R.id.fmShanghai,GEO_SHANGHAI);
        setMapView(manager,R.id.fmShenzhen,GEO_SHENGZHENG);
        setMapView(manager,R.id.fmXian,GEO_XIAN);
    }

    private void setMapView(FragmentManager manager, int resId, LatLng ll) {
        SupportMapFragment fm = (SupportMapFragment) manager
                .findFragmentById(resId);

//      Class MapStatusUpdate  描述地圖狀態將要發生的變化
//      MapStatusUpdateFactory  生成地圖狀態將要發生的變化
        MapStatusUpdate latlng = MapStatusUpdateFactory.newLatLng(ll);

        fm.getBaiduMap().setMapStatus(latlng);
    }

}

(六)添加文字覆蓋物、多邊形覆蓋物、標註覆蓋物、彈出窗覆蓋物

public class OverlayActivity extends Activity {

    private MapView mvMap = null;
    private BaiduMap baiduMap = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overlay);

        mvMap = (MapView) findViewById(R.id.mvMap);

        baiduMap = mvMap.getMap();

        // 添加文字覆蓋物
        // addText();

        // 添加多邊形覆蓋物
        // addPolygon();

        // 設置標記
        // addMarker();

        // 設置彈出窗覆蓋物
        addInfoWindow();
    }

    private void addInfoWindow() {
        // 創建InfoWindow展示的View
        Button btn = new Button(this);

        btn.setBackgroundColor(Color.BLUE);
        btn.setText("我愛北京天安門");

//      通過傳入的 view 構造一個 InfoWindow, 此時只是利用該view生成一個Bitmap繪製在地圖中
        /**
         * Parameters:
         * view - InfoWindow 展示的 view
         * position - InfoWindow 顯示的地理位置
         * yOffset - InfoWindow Y 軸偏移量(方向  +向下,-向上)
         */
        InfoWindow infoWindow = new InfoWindow(btn, new LatLng(39.9149390000,
                116.4042620000), 100);

        baiduMap.showInfoWindow(infoWindow);
    }

    private void addMarker() {
        MarkerOptions markerOptions = new MarkerOptions();

        ArrayList<BitmapDescriptor> list = new ArrayList<BitmapDescriptor>();
        list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_0));
        list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_1));
        list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_2));
        list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_3));
        list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_4));
        list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_5));
        list.add(BitmapDescriptorFactory.fromResource(R.drawable.bbs_icon_6));

        markerOptions.position(new LatLng(39.945, 116.404)).icons(list);
        baiduMap.addOverlay(markerOptions);
    }

    private void addPolygon() {
        List<LatLng> pts = new ArrayList<LatLng>();
        // 定義多邊形的五個頂點
        LatLng pt1 = new LatLng(39.93923, 116.357428);
        LatLng pt2 = new LatLng(39.91923, 116.327428);
        LatLng pt3 = new LatLng(39.89923, 116.347428);
        LatLng pt4 = new LatLng(39.89923, 116.367428);
        LatLng pt5 = new LatLng(39.91923, 116.387428);

        pts.add(pt1);
        pts.add(pt2);
        pts.add(pt3);
        pts.add(pt4);
        pts.add(pt5);

        // 構建用戶繪製多邊形的option對象
        /**
         * class Stroke 邊框類,可以給圓、多邊形設置一個邊框 構造函數 int strokeWidth 邊框的寬度, 單位:像素,
         * int color 邊框的顏色
         */
        OverlayOptions polygonOptions = new PolygonOptions().points(pts)
                .fillColor(0xAAFFFF00).stroke(new Stroke(5, 0xAA00FF00));

        baiduMap.addOverlay(polygonOptions);
    }

    private void addText() {
        // 自定義文字所顯示的座標點
        LatLng llText = new LatLng(39.9306540000, 116.3925480000);

        // 構建文字option對象,用於在地圖上添加文字,並設置文字背景色、字體大小、字體顏色、文本、旋轉角度、顯示位置
        OverlayOptions textOption = new TextOptions()
                .bgColor(Color.rgb(100, 100, 100)).fontSize(26)
                .fontColor(0xFFFF00FF).text("百度地圖SDK").rotate(0)
                .position(llText);
        // 在地圖上添加文字對象並顯示
        baiduMap.addOverlay(textOption);

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章