編輯:關於Android編程
定位中用得最多的是坐標(也就是經緯度),那麼我們首先搞清楚什麼是坐標:
LatLng 類:地理坐標基本數據結構。
字段詳細資料
提醒:經緯度我經常搞錯,不知道為什麼,大家特別在操作坐標的時候要格外注意。經緯度的數據類型是double
類型的。
百度的坐標拾取系統
每次大家想知道一個地方的坐標或者想拿幾個示例坐標,那麼就可以用這個。鼠標點擊地圖上任意一處地方就會得到該地點的坐標(顯示在右上角方框裡);效果圖(重點看一下紅框裡的內容):
地理范圍數據結構,由西南以及東北坐標點確認。雖然說用的不多,但它和坐標有點親屬關系,所以使不使用我們都介紹。
一般有XXX.Builder
的希望大家多多使用,盡量不要new
,當然了,有的類是有構造方法的有的沒有;嵌套類概要:
字段概要:
方法概要:
方法詳細資料:
public boolean contains(LatLng point)
判斷該地理范圍是否包含一個地理位置
參數:
point - 被判斷的地理位置
返回:
該地理范圍是否包含一個地理位置
public LatLng getCenter()
獲取該地理范圍的中心地理坐標
返回:
該地理范圍的中心地理坐標
構造器概要 :
方法概要:
方法詳細資料:
public LatLngBounds build()
創建地理范圍對象
返回:
創建出的地理范圍對象
public LatLngBounds.Builder include(LatLng point)
讓該地理范圍包含一個地理位置坐標
參數:
point - 地理位置坐標
返回:
該構造器對象
使用范例:
mBDMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
//坐標范圍
LatLng northeast = new LatLng(121.445541, 31.192286);
LatLng southwest = new LatLng(121.441624, 31.189922);
LatLngBounds llb = new LatLngBounds.Builder().include(northeast).include(southwest).build();
boolean isHas = llb.contains(new LatLng(121.443564, 31.190795));
Log.v(此功能地圖加載完畢的時候調用, 有還是沒有 + isHas + ,東北: + llb.northeast + 西南: + llb.southwest);
}
});
創建 activity_location.xml
:
編寫LocationDemo
類繼承自 BaseActivity:
/**
* Activity基類
*/
public class BaseActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法之前實現
SDKInitializer.initialize(getApplicationContext());
}
}
public class LocationDemo extends BaseActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener, BDLocationListener {
private MapView mMapView;
private BaiduMap mBDMap;
//定位
private Button requestLocBtn;
//定位圖層顯示方式
private MyLocationConfiguration.LocationMode mCurrentMode;
//用戶自定義定位圖標
private BitmapDescriptor mCurrentMarker;
//單選按鈕組
private RadioGroup rg;
//定位相關
private LocationClient mLocClient;
//是否第一次定位
private boolean isFirstLoc = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
initView();
}
private void initView() {
//請求定位
requestLocBtn = (Button) findViewById(R.id.location_btn);
//定位圖層顯示方式
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
requestLocBtn.setText(普通);
requestLocBtn.setOnClickListener(this);
//單選按鈕組
rg = (RadioGroup) findViewById(R.id.location_rg);
rg.setOnCheckedChangeListener(this);
//地圖初始化
mMapView = (MapView) findViewById(R.id.location_bdmap);
mBDMap = mMapView.getMap();
//開啟定位圖層
mBDMap.setMyLocationEnabled(true);
//定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(this);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);//打開GPS
option.setCoorType(bd09ll);//設置坐標類型
option.setScanSpan(1000);//設置請求間隔時間
mLocClient.setLocOption(option);//加載配置
mLocClient.start();//開始定位
}
//定位按鈕點擊事件
@Override
public void onClick(View v) {
switch (mCurrentMode) {
//普通態:更新定位數據時不對地圖做任何操作
case NORMAL:
requestLocBtn.setText(跟隨);
mCurrentMode = MyLocationConfiguration.LocationMode.FOLLOWING;
break;
//羅盤態,顯示定位方向圈,保持定位圖標在地圖中心
case COMPASS:
requestLocBtn.setText(普通);
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
break;
//跟隨態,保持定位圖標在地圖中心
case FOLLOWING:
requestLocBtn.setText(羅盤);
mCurrentMode = MyLocationConfiguration.LocationMode.COMPASS;
break;
}
//配置定位圖層顯示方式
mBDMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
//開始定位
mLocClient.start();
}
//單選事件
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.location_rb_defaulticon:
//傳入null則恢復默認圖標
mCurrentMarker = null;
break;
case R.id.location_rb_customicon:
//修改為自定義的Marker
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
break;
}
//配置定位圖層顯示方式
mBDMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
}
//定位監聽
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//如果bdLocation為空或mapView銷毀後不再處理新數據接收的位置
if (bdLocation == null || mMapView == null) {
return;
}
//定位數據
MyLocationData data = new MyLocationData.Builder()
//精度(半徑)
.accuracy(bdLocation.getRadius())
//此處設置開發者獲取到的方向信息,順時針0-360
.direction(100)
.latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
//設置定位數據
mBDMap.setMyLocationData(data);
//是否是第一次定位
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);
mBDMap.animateMapStatus(msu);
}
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//退出時銷毀定位
mLocClient.stop();
//關閉定位圖層
mBDMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
}
}
運行效果圖:
構造器概要:
構造器詳細資料:
public MyLocationConfiguration(MyLocationConfiguration.LocationMode mode,
boolean enableDirection,
BitmapDescriptor customMarker)
構造函數
參數:
mode - 定位圖層顯示方式, 默認為 LocationMode.NORMAL 普通態
enableDirection - 是否允許顯示方向信息
customMarker - 設置用戶自定義定位圖標,可以為 null
updateTimeEscap - 圖層刷新頻率,單位ms,若使用默認值,輸入0即可,默認為100ms
嵌套類概要 :
字段概要:
枚舉常量概要 :
方法概要:
方法詳細資料:
public static MyLocationConfiguration.LocationMode[] values()
按照聲明該枚舉類型的常量的順序, 返回 包含這些常量的數組。該方法可用於迭代 常量, 如下所示:
for (MyLocationConfiguration.LocationMode c : MyLocationConfiguration.LocationMode.values())
System.out.println(c);
返回:
按照聲明該枚舉類型的常量的順序, 返回 包含這些常量的數組
public static MyLocationConfiguration.LocationMode valueOf(java.lang.String name)
返回帶有指定名稱的該類型的枚舉常量。 字符串必須與用於聲明該類型的枚舉常量的 標識符完全匹配。(不允許有多余 的空格字符。)
參數:
name - 要返回的枚舉常量的名稱。
返回:
返回帶有指定名稱的枚舉常量
拋出:
如果該枚舉類型沒有帶有指定名稱的常量, - 則拋出 IllegalArgumentException
如果參數為空值, - 則拋出 NullPointerException
嵌套類概要 :
字段概要:
構造器概要:
方法概要 :
方法詳細資料:
public MyLocationData.Builder latitude(double lat)
設置定位數據的緯度
參數:
lat - 緯度
返回:
該構造器對象
public MyLocationData.Builder longitude(double lng)
設置定位數據的經度
參數:
lng - 經度
返回:
該構造器對象
public MyLocationData.Builder speed(float speed)
設置定位數據的速度
參數:
speed - 速度
返回:
該構造器對象
public MyLocationData.Builder direction(float direction)
設置定位數據的方向信息
參數:
direction - 方向
返回:
該構造器對象
public MyLocationData.Builder accuracy(float accuracy)
設置定位數據的精度信息,單位:米
參數:
accuracy - 精度信息,單位:米
返回:
該構造器對象
public MyLocationData.Builder satellitesNum(int num)
設置定位數據的衛星數目
參數:
num - 衛星數目
返回:
該構造器對象
public MyLocationData build()
構建生成定位數據對象
返回:
生成定位數據對象
看我們的最後一個方法[onDestroy()
] :
@Override
protected void onDestroy() {
super.onDestroy();
//退出時銷毀定位
mLocClient.stop();
//關閉定位圖層
mBDMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
}
這裡我們在編寫的時候一定要注意代碼順序,其次一定要mMapView = null;
釋放內存;這裡涉及到一個內存回收的知識點:
如果 stu=null
,也就是 new Student();
這個實例沒有被引用,那麼它在堆內存中被視為垃圾,虛擬機不會馬上回收它,但肯定會回收它。
前言Android View體系是界面編程的核心,他的重要性不亞於Android四大組件,在這個系列中我會陸續講到View坐標系、View的滑動、View的事件分發等文章
上一篇博客帶大家實現了:Android 自定義控件打造史上最簡單的側滑菜單 ,有兄弟看了以後說,你這滑動菜單過時了呀~QQ5.0的效果還不錯~~嗯,的確,上
(1)在res--menu目錄下的main.xml文件
ContentProvider 1.適用場景 1) ContentProvider為存儲和讀取數據提供了統一的接口 2) 使用ContentProvider,應用
1.android 的UI線程阻超過5秒就會引發ANR(Applicat