編輯:關於Android編程
在Android應用中,很多時候需要地圖功能,回顧過去寫的項目和百度地圖api,開始總結一下Android百度地圖的實現。首先總結一下怎麼開始一個Android百度地圖功能。
當使用百度地圖的時候,提到一個appkey。“在使用百度地圖SDK為您提供的各種LBS能力之前,您需要獲取百度地圖移動版的開發密鑰,該密鑰與您的百度賬戶相關聯。因此,您必須先有百度帳戶,才能獲得開發密鑰。並且,該密鑰與您創建的過程名稱有關。Key地址為:http://lbsyun.baidu.com/apiconsole/key”
這是百度地圖api給的定義。總之,一個項目包名和sha1對應一個appkey。首先注冊百度賬號,根據教程一步步創建appkey。
當有了appkey,我們就能開一部署一個android百度地圖環境。首先在百度api的相關下載中,將需要的功能勾選上,並下載相關的開發包,示例代碼等。將開發包導入項目libs文件夾下。然後,開始部署AndroidMinifest.xml,添加權限,添加appkey,定位的service。
下一步就是在activity_main.xml中添加布局文件。本片文章還有自定義的放大縮小,定位等功能。
顯示效果圖:
下面開始具體的代碼實現
當前程序有三個功能:顯示地圖,顯示定位,實現按鈕控制。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//初始化控件
initView();
//初始化地圖
initMap();
//定位
initLocation();
}
一。顯示基本地圖
初始化地圖顯示,將地圖在手機上顯示出來
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
// 不顯示縮放比例尺
mMapView.showZoomControls(false);
// 不顯示百度地圖Logo
mMapView.removeViewAt(1);
//百度地圖
mBaiduMap = mMapView.getMap();
// 改變地圖狀態,使地圖顯示在恰當的縮放大小
MapStatus mMapStatus = new MapStatus.Builder().zoom(15).build();
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);
二。地圖的控制按鈕:縮放按鈕,切換模式按鈕,開啟實時交通圖
1.在地圖初始化顯示時,我將自帶的縮放比例尺去掉了,需要自定義一個縮放按鈕。
我們一般顯示將地圖顯示在5-18級別中,所以在點擊事件中對按鈕進行了控制。
case R.id.ib_large:
if (zoomLevel < 18) {
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
ib_small.setEnabled(true);
} else {
showInfo("已經放至最大,可繼續滑動操作");
ib_large.setEnabled(false);
}
break;
case R.id.ib_small:
if (zoomLevel > 6) {
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
ib_large.setEnabled(true);
} else {
ib_small.setEnabled(false);
showInfo("已經縮至最小,可繼續滑動操作");
}
break;
zoomlevel是一個全局變量,這時候就需要實時監控地圖的縮放級別是多少,需要給地圖添加一個地圖狀態改變的監聽事件
//設置地圖狀態改變監聽器
mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus arg0) {
}
@Override
public void onMapStatusChangeFinish(MapStatus arg0) {
}
@Override
public void onMapStatusChange(MapStatus arg0) {
//當地圖狀態改變的時候,獲取放大級別
zoomLevel = arg0.zoom;
}
});
2.切換顯示模式和實時交通圖
boolean modeFlag = true;//設置初始時是普通模式
case R.id.ib_mode://衛星模式和普通模式
if(modeFlag){
modeFlag = false;
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
showInfo("開啟衛星模式");
}else{
modeFlag = true;
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
showInfo("開啟普通模式");
}
break;
case R.id.ib_traffic://是否開啟交通圖
if(mBaiduMap.isTrafficEnabled()){//判斷是否開啟了交通圖
mBaiduMap.setTrafficEnabled(false);
ib_traffic.setBackgroundResource(R.drawable.offtraffic);
showInfo("關閉實時交通圖");
}else{
mBaiduMap.setTrafficEnabled(true);
ib_traffic.setBackgroundResource(R.drawable.ontraffic);
showInfo("開啟實時交通圖");
}
break;
三。定位自己
定位自己的思路是:當程序啟動的時候,開啟定位圖層,開始定位,收到位置信息後將自己的位置顯示在地圖中間,當地圖離開自己的位置時,點擊定位自己的圖標將地圖重新顯示自己的位置。
首先,開啟定位圖層,開始定位。
@Override
protected void onStart() {
super.onStart();
//開啟定位
mBaiduMap.setMyLocationEnabled(true);
if(!mLocationClient.isStarted()){//如果定位client沒有開啟,開啟定位
mLocationClient.start();
}
}
private void initLocation() {
//定位客戶端的設置
mLocationClient = new LocationClient(this);
mLocationListener = new MyLocationListener();
//注冊監聽
mLocationClient.registerLocationListener(mLocationListener);
//配置定位
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");//坐標類型
option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
option.setOpenGps(true);//打開Gps
option.setScanSpan(1000);//1000毫秒定位一次
option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation.getPoiList裡得到
mLocationClient.setLocOption(option);
}
//自定義的定位監聽
private class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
//將獲取的location信息給百度map
MyLocationData data = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(data);
if(isFirstLocation){
//獲取經緯度
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
//mBaiduMap.setMapStatus(status);//直接到中間
mBaiduMap.animateMapStatus(status);//動畫的方式到中間
isFirstLocation = false;
showInfo("位置:" + location.getAddrStr());
}
}
}
注意,設置isFirstLocation=true,這樣我們就只是開始的時候定位自己,並顯示在地圖中間,不會每一秒都跳一次。在我門需要定位的時候,將isFirstLocation重新設置成true就行。
case R.id.ib_loc:
isFirstLocation = true;
showInfo("返回自己位置");
break;
不要忘記在活動結束的時候,將定位取消
@Override
protected void onStop() {
super.onStop();
//關閉定位
mBaiduMap.setMyLocationEnabled(false);
if(mLocationClient.isStarted()){
mLocationClient.stop();
}
}
然後運行程序,發現一個帶有定位功能,並能部分控制地圖顯示的app出來了,下面是MainActivity的源碼
package 包名;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
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.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;
/**
* 我的百度地圖首頁
* @author jing__jie
*
*/
public class MainActivity extends Activity implements OnClickListener {
private MapView mMapView = null;
private BaiduMap mBaiduMap;
private ImageButton ib_large,ib_small,ib_mode,ib_loc,ib_traffic;
//模式切換,正常模式
private boolean modeFlag = true;
//當前地圖縮放級別
private float zoomLevel;
//定位相關
private LocationClient mLocationClient;
private MyLocationListener mLocationListener;
//是否第一次定位,如果是第一次定位的話要將自己的位置顯示在地圖 中間
private boolean isFirstLocation = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//初始化控件
initView();
//初始化地圖
initMap();
//定位
initLocation();
}
private void initMap() {
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
// 不顯示縮放比例尺
mMapView.showZoomControls(false);
// 不顯示百度地圖Logo
mMapView.removeViewAt(1);
//百度地圖
mBaiduMap = mMapView.getMap();
// 改變地圖狀態
MapStatus mMapStatus = new MapStatus.Builder().zoom(15).build();
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);
//設置地圖狀態改變監聽器
mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus arg0) {
}
@Override
public void onMapStatusChangeFinish(MapStatus arg0) {
}
@Override
public void onMapStatusChange(MapStatus arg0) {
//當地圖狀態改變的時候,獲取放大級別
zoomLevel = arg0.zoom;
}
});
}
private void initLocation() {
//定位客戶端的設置
mLocationClient = new LocationClient(this);
mLocationListener = new MyLocationListener();
//注冊監聽
mLocationClient.registerLocationListener(mLocationListener);
//配置定位
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");//坐標類型
option.setIsNeedAddress(true);//可選,設置是否需要地址信息,默認不需要
option.setOpenGps(true);//打開Gps
option.setScanSpan(1000);//1000毫秒定位一次
option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否需要POI結果,可以在BDLocation.getPoiList裡得到
mLocationClient.setLocOption(option);
}
private void initView() {
//地圖控制按鈕
ib_large = (ImageButton)findViewById(R.id.ib_large);
ib_large.setOnClickListener(this);
ib_small = (ImageButton)findViewById(R.id.ib_small);
ib_small.setOnClickListener(this);
ib_mode = (ImageButton)findViewById(R.id.ib_mode);
ib_mode.setOnClickListener(this);
ib_loc = (ImageButton)findViewById(R.id.ib_loc);
ib_loc.setOnClickListener(this);
ib_traffic = (ImageButton)findViewById(R.id.ib_traffic);
ib_traffic.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ib_large:
if (zoomLevel < 18) {
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
ib_small.setEnabled(true);
} else {
showInfo("已經放至最大,可繼續滑動操作");
ib_large.setEnabled(false);
}
break;
case R.id.ib_small:
if (zoomLevel > 6) {
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
ib_large.setEnabled(true);
} else {
ib_small.setEnabled(false);
showInfo("已經縮至最小,可繼續滑動操作");
}
break;
case R.id.ib_mode://衛星模式和普通模式
if(modeFlag){
modeFlag = false;
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
showInfo("開啟衛星模式");
}else{
modeFlag = true;
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
showInfo("開啟普通模式");
}
break;
case R.id.ib_loc:
isFirstLocation = true;
showInfo("返回自己位置");
break;
case R.id.ib_traffic://是否開啟交通圖
if(mBaiduMap.isTrafficEnabled()){
mBaiduMap.setTrafficEnabled(false);
ib_traffic.setBackgroundResource(R.drawable.offtraffic);
showInfo("關閉實時交通圖");
}else{
mBaiduMap.setTrafficEnabled(true);
ib_traffic.setBackgroundResource(R.drawable.ontraffic);
showInfo("開啟實時交通圖");
}
break;
default:
break;
}
}
@Override
protected void onStart() {
super.onStart();
//開啟定位
mBaiduMap.setMyLocationEnabled(true);
if(!mLocationClient.isStarted()){
mLocationClient.start();
}
}
@Override
protected void onStop() {
super.onStop();
//關閉定位
mBaiduMap.setMyLocationEnabled(false);
if(mLocationClient.isStarted()){
mLocationClient.stop();
}
}
@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();
}
//顯示消息
private void showInfo(String str){
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
}
//自定義的定位監聽
private class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
//將獲取的location信息給百度map
MyLocationData data = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此處設置開發者獲取到的方向信息,順時針0-360
.direction(100)
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
mBaiduMap.setMyLocationData(data);
if(isFirstLocation){
//獲取經緯度
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
//mBaiduMap.setMapStatus(status);//直接到中間
mBaiduMap.animateMapStatus(status);//動畫的方式到中間
isFirstLocation = false;
showInfo("位置:" + location.getAddrStr());
}
}
}
}
再看文章之前,希望大家先打開自己的微信點到朋友圈中去,仔細觀察是不是發現朋友圈裡的有個“九宮格”的圖片區域,點擊圖片又會跳到圖片的詳細查看頁面,並且支持圖片的滑動和縮放?
一.概述代理模式也是平時比較常用的設計模式之一,代理模式其實就是提供了一個新的對象,實現了對真實對象的操作,或成為真實對象的替身.在日常生活中也是很常見的.例如A要租房,
github對應地址:https://github.com/hejunlin2013/TVSample,截至到當前發稿,已突破200star,如果喜歡的話,可以star,
先看效果圖 這個是我們自己的apk點擊之後的效果 下邊是布局文件vcD4KPHA+YWN0aXZpdHlfbWFpbi54bWzW97K8vtbOxLz+PG