0四、抽取BaseActivity

// 在使用SDK各組件以前初始化context信息,傳入ApplicationContext
        // 注意該方法要再setContentView方法以前實現
        // SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        // 獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);// MapView用於顯示
        // 獲取地圖控制器
        baiduMap = mMapView.getMap();// BaiduMap地圖控制器用於控制
        // 這個很明顯就是一個MVC模式,你這個地圖顯示出來以後呢我想改變顯示的形狀.好比說我想讓地圖旋轉或者說是讓地圖放大.
        // 就是經過這個控制器來實現.這個是一個標準的MVC模式了.
        // 1. 隱藏縮放按鈕、比例尺
        // mMapView.showScaleControl(false);//顯示比例控件 隱藏比例按鈕
        // 默認是顯示比例按鈕的.Scale是規模,比例,刻度
        // mMapView.showZoomControls(false);//隱藏縮放按鈕,默認是顯示縮放按鈕的.

        // 2. 獲取獲取最小(3)、最大縮放級別(20)
        float maxZoomLevel = baiduMap.getMaxZoomLevel();// 獲取地圖最大縮放級別 用本地/局部變量保存
        float minZoomLevel = baiduMap.getMinZoomLevel();// 獲取地圖最小縮放級別
        Log.i(TAG, "minZoomLevel = " + minZoomLevel + ", maxZoomLevel"
                + maxZoomLevel);

        // 3. 設置地圖中心點爲黑馬
        // MapStatusUpdate mapStatusUpdate = new
        // HelloBaiduMapActivity();//MapStatusUpdate是沒有構造方法的,因此你Alt+/ new不出來.
        MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
                .newLatLng(hmPos);
        baiduMap.setMapStatus(mapStatusUpdate);// setMapStatus是baiduMap地圖控制器的方法.把這個狀態傳給我這個baiduMap.那我立馬就能給你跳到這個位置.
        // 4.設置地圖縮放爲15
        mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 不new一個經緯度的狀態,是new一個縮放的狀態.zoomTo是縮放一個絕對值.重複調用zoomTo()它仍是縮放到那個數值.
        baiduMap.setMapStatus(mapStatusUpdate);

抽取HelloBaiduMapActivity.java的這一段代碼到BaseActivity.java.java

    // 常量要放在最前面.
    /** 黑馬座標(北京市海淀區東北旺南路45號) */
    protected LatLng hmPos = new LatLng(40.050513, 116.30361);// LatLng的一個常量表示.
    /** 傳智座標 */
    protected LatLng czPos = new LatLng(40.065817, 116.349902);
    /** 天安門座標 */
    protected LatLng tamPos = new LatLng(39.915112, 116.403963);

    private MapView mMapView;
    private BaiduMap baiduMap;

這一段也是,變量名也一塊兒拿過來.android

這幾個生命週期方法確定也是須要要抽取的,若是說你寫了其餘界面用了百度地圖確定也要調這幾個生命週期方法.因此把這幾個生命週期方法也放到父類來.只要繼承父類子類就不用寫這些代碼了.編程

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
        // 解除註冊接收者
        //unregisterReceiver(receiver);
    }

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

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

6.獲取地圖Ui控制器:隱藏指南針   第六步寫到base裏面去api

        // 6.獲取地圖Ui控制器:隱藏指南針   第六步寫到base裏面去
        //UiSettings uiSettings = baiduMap.getUiSettings();
        //uiSettings.setCompassEnabled(false);  //   不顯示指南針

API怎麼去調用的不須要記住,可是java的一些思想仍是須要記住的.例如這裏的java基礎的技巧:這裏加final是爲了避免讓子類覆蓋,緣由是爲了預防這裏的一些類還沒初始化的時候就被子類調用.網絡

package com.itheima.baidumap74;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.UiSettings;
import com.baidu.mapapi.model.LatLng;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.Toast;

public abstract class BaseActivity extends Activity{

    // 常量要放在最前面.
    private static final String TAG = "BaseActivity";//TAG通常以它類名.
    /** 黑馬座標(北京市海淀區東北旺南路45號) */
    protected LatLng hmPos = new LatLng(40.050513, 116.30361);// LatLng的一個常量表示.
    /** 傳智座標 */
    protected LatLng czPos = new LatLng(40.065817, 116.349902);
    /** 天安門座標 */
    protected LatLng tamPos = new LatLng(39.915112, 116.403963);

    
    //private MapView mMapView;//
    protected MapView mMapView;//改一下修飾符,讓子類HelloBaiduMapActivity.java能夠訪問.
    //private BaiduMap baiduMap;
    protected BaiduMap baiduMap;//改一下修飾符,讓子類HelloBaiduMapActivity.java能夠訪問.
    
    //  這裏加final是爲了避免讓子類覆蓋,緣由是爲了預防這裏的一些類還沒初始化的時候就被子類調用.
    @Override
    //protected void onCreate(Bundle savedInstanceState) {
    protected final void onCreate(Bundle savedInstanceState) {//加final,不讓子類HelloBaiduMapActivity.java覆蓋onCreate方法.
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        // 在使用SDK各組件以前初始化context信息,傳入ApplicationContext
        // 注意該方法要再setContentView方法以前實現
        // SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        // 獲取地圖控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);// MapView用於顯示
        // 獲取地圖控制器
        baiduMap = mMapView.getMap();// BaiduMap地圖控制器用於控制
        // 這個很明顯就是一個MVC模式,你這個地圖顯示出來以後呢我想改變顯示的形狀.好比說我想讓地圖旋轉或者說是讓地圖放大.
        // 就是經過這個控制器來實現.這個是一個標準的MVC模式了.
        // 1. 隱藏縮放按鈕、比例尺
        // mMapView.showScaleControl(false);//顯示比例控件 隱藏比例按鈕
        // 默認是顯示比例按鈕的.Scale是規模,比例,刻度
        // mMapView.showZoomControls(false);//隱藏縮放按鈕,默認是顯示縮放按鈕的.

        // 2. 獲取獲取最小(3)、最大縮放級別(20)
        float maxZoomLevel = baiduMap.getMaxZoomLevel();// 獲取地圖最大縮放級別 用本地/局部變量保存
        float minZoomLevel = baiduMap.getMinZoomLevel();// 獲取地圖最小縮放級別
        Log.i(TAG, "minZoomLevel = " + minZoomLevel + ", maxZoomLevel"
                + maxZoomLevel);

        // 3. 設置地圖中心點爲黑馬
        // MapStatusUpdate mapStatusUpdate = new
        // HelloBaiduMapActivity();//MapStatusUpdate是沒有構造方法的,因此你Alt+/ new不出來.
        MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
                .newLatLng(hmPos);
        baiduMap.setMapStatus(mapStatusUpdate);// setMapStatus是baiduMap地圖控制器的方法.把這個狀態傳給我這個baiduMap.那我立馬就能給你跳到這個位置.
        // 4.設置地圖縮放爲15
        mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 不new一個經緯度的狀態,是new一個縮放的狀態.zoomTo是縮放一個絕對值.重複調用zoomTo()它仍是縮放到那個數值.
        baiduMap.setMapStatus(mapStatusUpdate);
        
        // 6.獲取地圖Ui控制器:隱藏指南針   第六步寫到base裏面去
        //UiSettings uiSettings = baiduMap.getUiSettings();
        //uiSettings.setCompassEnabled(false);  //   不顯示指南針
        
        init();
    }
    /**  這個方法讓子類實現  */
    public abstract void init();
    
    
    /**
     * 在屏幕中央顯示一個Toast
     * @param text
     */
    public void showToast(CharSequence text){//字符序列.字符序列這個接口
        //CharSequence實際上是咱們String的父類.String是實現了這個接口的.
        //因此說咱們最好面向接口來編程.這樣子這個方法更加通用.
           Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);//局部變量toast
           toast.setGravity(Gravity.CENTER, 0, 0);
           toast.show();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
        // 解除註冊接收者
        //unregisterReceiver(receiver);
    }

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

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

}
package com.itheima.baidumap74;

//Ctrl+Shift+O清除多餘的包名.
//import com.baidu.mapapi.SDKInitializer;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;

import com.baidu.mapapi.SDKInitializer;
//import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
//import com.baidu.mapapi.map.MapView;
//import com.baidu.mapapi.model.LatLng;

public  class HelloBaiduMapActivity extends BaseActivity {
    //初始化方法通常放到最前面來.
    @Override
    public void init() {
        // TODO Auto-generated method stub
        registerSDKCheckReceiver();
        baiduMap.addHeatMap(null);
    }
    // 常量要放在最前面.
    private static final String TAG = "HelloBaiduMapActivity";// 這個常量咱們通常用它的類名就好了.
    /** 黑馬座標(北京市海淀區東北旺南路45號) */
    //protected LatLng hmPos = new LatLng(40.050513, 116.30361);// LatLng的一個常量表示.
    /** 傳智座標 */
    //protected LatLng czPos = new LatLng(40.065817, 116.349902);
    /** 天安門座標 */
    //protected LatLng tamPos = new LatLng(39.915112, 116.403963);


    //private MapView mMapView;
    private BroadcastReceiver receiver;// 把receiver由局部/本地變量變成成員變量
    //private BaiduMap baiduMap;

    /*@Override
    protected void onCreate(Bundle savedInstanceState) {//父類BaseActivity.java不給覆蓋onCreate()那HelloBaiduMapActivity的初始化代碼寫哪裏去呢?
        baiduMap.addHeatMap(null);//baiduMap這時候尚未初始化,因此會出現空指針異常.爲了預防baiduMap在初始化以前調用,
        super.onCreate(savedInstanceState);//baiduMap是在父類的onCreate方法裏面初始化的.
        registerSDKCheckReceiver();
        /*
         * // 在使用SDK各組件以前初始化context信息,傳入ApplicationContext //
         * 注意該方法要再setContentView方法以前實現 //
         * SDKInitializer.initialize(getApplicationContext());
         * setContentView(R.layout.activity_main); // 獲取地圖控件引用 mMapView =
         * (MapView) findViewById(R.id.bmapView);// MapView用於顯示 // 獲取地圖控制器
         * baiduMap = mMapView.getMap();// BaiduMap地圖控制器用於控制 //
         * 這個很明顯就是一個MVC模式,你這個地圖顯示出來以後呢我想改變顯示的形狀.好比說我想讓地圖旋轉或者說是讓地圖放大. //
         * 就是經過這個控制器來實現.這個是一個標準的MVC模式了. // 1. 隱藏縮放按鈕、比例尺 //
         * mMapView.showScaleControl(false);//顯示比例控件 隱藏比例按鈕 //
         * 默認是顯示比例按鈕的.Scale是規模,比例,刻度 //
         * mMapView.showZoomControls(false);//隱藏縮放按鈕,默認是顯示縮放按鈕的.
         * 
         * // 2. 獲取獲取最小(3)、最大縮放級別(20) float maxZoomLevel =
         * baiduMap.getMaxZoomLevel();// 獲取地圖最大縮放級別 用本地/局部變量保存 float
         * minZoomLevel = baiduMap.getMinZoomLevel();// 獲取地圖最小縮放級別 Log.i(TAG,
         * "minZoomLevel = " + minZoomLevel + ", maxZoomLevel" + maxZoomLevel);
         * 
         * // 3. 設置地圖中心點爲黑馬 // MapStatusUpdate mapStatusUpdate = new //
         * HelloBaiduMapActivity();//MapStatusUpdate是沒有構造方法的,因此你Alt+/ new不出來.
         * MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
         * .newLatLng(hmPos); baiduMap.setMapStatus(mapStatusUpdate);//
         * setMapStatus是baiduMap地圖控制器的方法.把這個狀態傳給我這個baiduMap.那我立馬就能給你跳到這個位置. //
         * 4.設置地圖縮放爲15 mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);//
         * 不new一個經緯度的狀態,是new一個縮放的狀態.zoomTo是縮放一個絕對值.重複調用zoomTo()它仍是縮放到那個數值.
         * baiduMap.setMapStatus(mapStatusUpdate);
         
    }*/

    // 6.獲取地圖Ui控制器:隱藏指南針
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        MapStatusUpdate mapStatusUpdate = null;// 在最前面聲明一個狀態,而後默認值給它一個null

        switch (keyCode) {
        // 5.更新地圖狀態
        case KeyEvent.KEYCODE_1:
            // 1)縮小
            mapStatusUpdate = MapStatusUpdateFactory.zoomOut();
            break;
        case KeyEvent.KEYCODE_2:
            // 2)放大
            mapStatusUpdate = MapStatusUpdateFactory.zoomIn();
            break;
        case KeyEvent.KEYCODE_3:

            // 3)旋轉(0 ~ 360),每次在原來的基礎上再旋轉30度
            MapStatus currentMapStatus = baiduMap.getMapStatus(); // 獲取地圖當前的狀態.
            float rotate = currentMapStatus.rotate + 30;// 拿出它原來的旋轉角度.
            Log.i(TAG, "rotate = " + rotate);// 打印旋轉角度
            MapStatus mapStatus = new MapStatus.Builder().rotate(rotate)
                    .build();// MapStatus不能直接new它由於它沒有構造方法,你要new的是它MapStatus.Builder的那個類.最後再
            // 調用build()就能返回地圖的一個狀態.可是返回以前須要設置一下旋轉角度.rotate()設置旋轉角度.
            mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
            break;
        case KeyEvent.KEYCODE_4:
            // 4)俯仰(0 ~ -45),每次在原來的基礎上再俯仰-5度
            currentMapStatus = baiduMap.getMapStatus();// 獲取地圖當前的狀態.
            float overlook = currentMapStatus.overlook - 5;// 爲何要俯仰負5度?後面演示的時候再說.由於咱們拿出來是45,再減5就變成50了.因此是這個地方誤導了一下,誤導了.其實俯仰角度最大是負45.爲何要減5?
            // 由於它這個只支持負數,你給它一個正數它是看不到俯仰效果的.
            Log.i(TAG, "overlook = " + overlook);// 打印俯仰角度
            mapStatus = new MapStatus.Builder().overlook(overlook).build();// MapStatus沒有構造方法你只能從新去new它的Builder().而後調一下build()方法它就建立出來這個狀態對象.
            // build()以前要進行一個俯仰.overlook()設置俯仰角度.
            mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);
            break;
        case KeyEvent.KEYCODE_5:
            // 5)移動
            mapStatusUpdate = MapStatusUpdateFactory.newLatLng(czPos);// 移動,它是沒有move這種方法的.移動的實現是你給它一個位置(經緯度)就好了.
            // 移動這個狀態呢它是瞬間改變你看不到效果.
            baiduMap.animateMapStatus(mapStatusUpdate, 2000);// animateMapStatus是能看到過程的,以動畫的形式改變這個狀態.2000ms,讓它兩秒鐘完成.
            return super.onKeyDown(keyCode, event);// 一return這個語句就完了它就不會走下面.

        }
        baiduMap.setMapStatus(mapStatusUpdate);// 這是瞬間改變看不到過程.
        return super.onKeyDown(keyCode, event);
    }

    @SuppressWarnings("unused")
    private void registerSDKCheckReceiver() {
        // 若是你不註冊這個廣播假設你這個key錯了你也不知道.你可能會認爲哪一步錯了而後找好久找不到緣由.因此咱們最好去註冊一下這樣的一個廣播.
        receiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                // 若是說接收到廣播就會跑到這裏面來.
                // 這裏面因爲咱們是有兩個action,咱們要進行一個判斷,先把它們取出來.
                String action = intent.getAction();
                if (SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR
                        .equals(action)) {// 首先是這個網絡錯誤,.
                    // 顯示吐司這種代碼很經常使用,若是說咱們有一個base的話呢之後咱們顯示吐司會很是方便.
                    // 這個base類你們應該不陌生.
                    // 當咱們接收到這一個網絡處理故障的廣播的時候呢,
                    showToast("網絡錯誤");

                } else if (SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR
                        .equals(action)) {
                    showToast("key驗證失敗");

                }
            }
            // 由於代碼不會不少我就直接new它的內部類了.
        };
        IntentFilter filter = new IntentFilter();// 本地變量,局部變量.IntentFilter是比較關鍵,也就是說你要攔截哪些廣播就經過它來指定.
        // 監聽網絡錯誤
        filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);// 廣播會以action的方式發出來.這個action從哪裏來呢?
        // 咱們最主要的還不是監聽網絡錯誤,咱們須要的是權限檢查的錯誤
        // 監聽百度地圖sdk 的key是否正確.
        filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
        // 只要這兩個廣播一發出來,那你這個接收者呢就能接收到
        // 註冊接收者
        registerReceiver(receiver, filter);// 接收一個廣播接收者BroadcastReceiver,IntentFilter.
    }

    // Ctrl+I格式化
    // 這是百度地圖規定的,它mMapView也有生命週期方法,你必須在Activity相應的生命週期方法裏面呢去調mMapView對應的生命週期方法.
    // 這個就沒什麼好記的了,死記硬背就好了.照着調用.
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        //mMapView.onDestroy();
        // 解除註冊接收者
        unregisterReceiver(receiver);//解除註冊仍是放回來.
    }
   /*
    @Override
    protected void onResume() {
        super.onResume();
        // 在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }

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

}
相關文章
相關標籤/搜索