04、抽取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.

    // 常量要放在最前面.
    /** 黑马坐标(北京市海淀区东北旺南路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;

这一段也是,变量名也一起拿过来.

这几个生命周期方法肯定也是需要要抽取的,如果说你写了其他界面用了百度地图肯定也要调这几个生命周期方法.所以把这几个生命周期方法也放到父类来.只要继承父类子类就不用写这些代码了.

    @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里面去

        // 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();
    }
*/

}

 

posted on 2017-08-02 20:07  绿茵好莱坞  阅读(370)  评论(0编辑  收藏  举报

导航