不知不覺研究百度地圖也已經(jīng)3斤程,4天了备典,雖然我們一直停留在MainActivty上,但是也已經(jīng)取得很不錯的成果了(有些圖標(biāo)尤勋,UI細(xì)節(jié)沒有在簡書文章上指出)
可以看到我們的演示效果变隔,雖然畫質(zhì)渣渣(壓縮gif的緣故)但是也是有點樣子的對吧规伐。
這也算我們實現(xiàn)的第一個階段吧,下一個階段會實現(xiàn)其他的功能匣缘,但是可能更新頻率不會很快猖闪,我要修養(yǎng)一段時間(開玩笑啦,其實是轉(zhuǎn)Php去了肌厨,不能落下任何一個不是嘛培慌。)不過這個我是不會放棄的,我會堅持把他做到我期待的樣子柑爸,并把我開發(fā)的全過程用簡書記錄下來吵护。
1.開始今天的旅行
目前百度地圖SDK所集成的檢索服務(wù)包括:POI檢索、公交信息查詢竖配、線路規(guī)劃何址、地理編碼里逆、行政區(qū)邊界數(shù)據(jù)檢索进胯、在線建議查詢、短串分享(包括POI搜索結(jié)果分享原押、駕車/公交/騎行/步行路線規(guī)劃分享胁镐、反向地理編碼結(jié)果分享)
POI(Point of Interest)
中文可以翻譯為“興趣點”。在地理信息系統(tǒng)中诸衔,一個POI可以是一棟房子盯漂、一個商鋪、一個郵筒笨农、一個公交站等就缆。
首先我們看一下我們百度提供的說明,
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/retrieval
這里的檢索主要分為五個步驟谒亦,主要有3個類型
下面是百度demo里的一段代碼竭宰,主要是顯示在線搜索結(jié)果,那么這都是什么意思呢份招,這里我詳細(xì)說一下切揭。
大家可以拿著百度地圖對照,首先我們點擊首頁的搜索框進(jìn)入一個單獨(dú)的頁面锁摔,輸入搜索詞廓旬,比如說北京大學(xué),這時候下面立馬顯示一排搜索結(jié)果谐腰,并顯示一些信息孕豹,那么本應(yīng)該就是我們的SuggestionSearch涩盾,中文可以譯作搜索建議,這個建議包含了很多數(shù)據(jù)巩步,包括名稱旁赊,地理位置等
但是百度這里用的是onGetPoiResult,(可以看到他每一條都帶有詳細(xì)的介紹)我們也打算用這個椅野,
那么我們點擊搜索按鈕的話
可以看到终畅,這里有一個列表,一個地圖竟闪,地圖上還有標(biāo)注离福。
這里就是我們的onGetPoiResult獲取的結(jié)果。
最后還有一個onGetPoiDetailResult炼蛤,從名字看當(dāng)然是詳情啦妖爷。
梳理結(jié)束之后,我們要思考設(shè)計一個頁面理朋。
……一個非專業(yè)的UI正在苦癟界面……請稍后……
兩天之后……
我終于回來了絮识,那么我回來帶來了什么呢?
個人認(rèn)為這個界面還是看的過去的嗽上,因為畢竟不是專業(yè)的UI次舌,所以有些細(xì)節(jié)還得推敲一下。
當(dāng)然如果今天我在這里將UI設(shè)計的代碼那可能就跑偏了兽愤,我最多只會說說這個UI界面是怎么實現(xiàn)的彼念。
首先我們回到首頁
2.UI分析
點擊首頁的toolbar進(jìn)入搜索頁面,這里的搜索頁面可以看到分為三部分浅萧,上方的toolbar逐沙,中間的tablayout,下面的viewpager洼畅,viewpager中在推薦這個頁面是一個fragment吩案,包含一個列表和一個下拉刷新,后期會添加一些歷史紀(jì)錄啥的帝簇。
那么我們輸入關(guān)鍵字 “天安門廣場” 是怎么出來這個列表的呢徘郭?
下面直接上代碼
//這是poi搜索的準(zhǔn)備,進(jìn)行一個初始化己儒,在onCreate()里開始調(diào)用
// 初始化搜索模塊崎岂,注冊搜索事件監(jiān)聽
mPoiSearch = PoiSearch.newInstance();
mPoiSearch.setOnGetPoiSearchResultListener(this);
然后他會要求activity實現(xiàn)他的接口里的方法,一共3個
/**
* 獲取POI搜索結(jié)果闪湾,包括searchInCity冲甘,searchNearby,searchInBound返回的搜索結(jié)果
* @param result
*/
public void onGetPoiResult(PoiResult result) {
}
/**
* 獲取POI詳情搜索結(jié)果,得到searchPoiDetail返回的搜索結(jié)果
* @param result
*/
public void onGetPoiDetailResult(PoiDetailResult result) {
}
//暫時先不管這個
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
最后別忘記銷毀釋放資源
@Override
protected void onDestroy() {
//銷毀江醇,釋放資源
mPoiSearch.destroy();
super.onDestroy();
}
這樣我們的一個搜索框架就搭建好了濒憋,有建立,監(jiān)聽和銷毀
下面我們來填充一下陶夜。
下面是我們的搜索框的TextWatcher
mpoi_se.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
//先清空列表凛驮,這個列表是儲存著onGetPoiResult結(jié)果
//的列表,也就是說我們一旦改變了輸入框內(nèi)容条辟,那么
//以前的數(shù)據(jù)也就沒用了黔夭,必須清空
poi_list.clear();
//這里的判斷也就是說如果獲取到的內(nèi)容不為空就開始
//搜索,為空就直接調(diào)用更新UI的方法更新一個空列表羽嫡。
if(!mpoi_se.getText().toString().equals("")){
//s_page角色是搜索頁碼本姥,因為搜索結(jié)果很多,
//肯定是分頁加載杭棵,默認(rèn)是加載第0頁
s_page = 0;
//這里主要控制著婚惫,搜附近還是搜城市
//假如說我們從主頁面進(jìn)入搜索頁,那就是搜城市
//從搜城市搜出來的結(jié)果item項進(jìn)入它的附近就是搜
//附近魂爪,那其實這兩個方法都大同小異先舷,一會在下面貼
if(getIntent().getStringExtra("KEY")!=null){
search_nearby(0);
Log.d("SESO", "GetMessage key: 附近");
}else{
search(0);
Log.d("SESO", "GetMessage key: 城市");
}
//這里我寫了一個通知開始刷新的方法,主要是
//UI上的滓侍,如果要寫這個poi搜素蒋川,UI可以自己寫
//我就不貼UI相關(guān)的代碼了
sendRefreshNotify("START");
}else{
//如果查詢空串自動復(fù)位,這就是更新UI的方法
//同樣不貼了
LoadSuggestFragment();
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
可以看到我們的邏輯還是相當(dāng)簡單的
1.清空上次搜索的舊數(shù)據(jù)
2.搜索頁面s_page置為0
3.根據(jù)從某個頁面來的intent攜帶的值來判斷是搜城市還是搜附近
那么搜城市的代碼是這樣的
private void search(int i) {
try {
//1.city方法當(dāng)然填入你現(xiàn)在所在的城市粗井,從主頁面可以獲取到尔破,通
//過Intent傳過來就好
//2.keyword是你的搜索關(guān)鍵字也就是輸入框里打的內(nèi)容
//3.isReturnAddr返回地址為真
//4.pagenum是請求第幾頁啦
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(getIntent().getStringExtra("CITY")).keyword(mpoi_se.getText().toString())
.isReturnAddr(true)
.pageNum(i));
} catch (Exception e) {
e.printStackTrace();
}
Log.d("SE", "onClick: 開始搜索");
}
搜附近也類似
private void search_nearby(int i) {
Double lati_ = getIntent().getDoubleExtra("LOCATION_latitude",39.92235);
Double long_ = getIntent().getDoubleExtra("LOCATION_longitude",116.380338);
//搜索附近
//keyword不啰嗦
//sortType是一個排序規(guī)則街图,從我們傳遞的參數(shù)來看浇衬,這個一
//個由近到遠(yuǎn)的排序規(guī)則
//location是一個坐標(biāo)點,也就是從誰附近搜這個location就是誰
//radius是一個搜索半徑餐济,單位是m
//pagenum不啰嗦
LatLng latLng = new LatLng(lati_,long_);
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption().keyword(mpoi_se.getText()
.toString()).sortType(PoiSortType.distance_from_near_to_far).location(latLng)
.radius(10000).pageNum(i);
mPoiSearch.searchNearby(nearbySearchOption);
}
這是兩種搜索方法耘擂,搜區(qū)域我就不說了,如果有人需要的話可以參考百度demo
那么我們的搜索結(jié)果在三個重寫的方法里接受絮姆,這里主要是第一個方法醉冤,其余的都沒有用到
public void onGetPoiResult(PoiResult result) {
//得到結(jié)果后,通知停止刷新
sendRefreshNotify("STOP");
//搜索結(jié)果篙悯,為空或者空錯誤
if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
Toast.makeText(SeActivity.this, "未找到結(jié)果", Toast.LENGTH_LONG)
.show();
return;
}
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
//用一個foreach語句將結(jié)果傳遞給我們的列表
for (PoiInfo poiInfo : result.getAllPoi()) {
poi_list.add(0,poiInfo);
}
//有了數(shù)據(jù)蚁阳,當(dāng)然是通知ui,加載列表
LoadSuggestFragment();
}
}
那么其實我們的PoiInfo已經(jīng)包含了這個地方的名字鸽照,地址螺捐,電話,位置坐標(biāo)等等,如果你想計算他到某個點的位置還可以通過下面的語法來計算
dis = DistanceUtil.getDistance(latLng, poiInfo.location);
其實一個簡單的poi搜索就這么點東西定血,初始化赔癌,搜索,接收數(shù)據(jù)澜沟,銷毀灾票。
那可能有朋友就會問了,我們重寫的三個方法茫虽,只用了一個方法刊苍,另外兩個呢?
其實第二個onGetPoiDetailResult是獲取詳情結(jié)果濒析,第三個是onGetPoiIndoorResult是獲取室內(nèi)的結(jié)果(我們這里沒考慮室內(nèi)的情況)班缰,我們來看看第二種情況。
首先還是我們的初始化悼枢,銷毀埠忘,重寫的方法還是那些,只不過我們的搜索變成了這個樣子馒索,這里的poiUid接受一個uid參數(shù)莹妒,這個參數(shù)是onGetPoiResult獲取的結(jié)果里的PoiInfo的一個屬性,也就是說我們只要得到onGetPoiResult結(jié)果才能使用onGetPoiDetailResult
//查看詳情
mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
.poiUid(getIntent().getStringExtra("UID")));
那么我們來看一下搜索結(jié)果
這里我們直接將搜索結(jié)果的detailUrl屬性傳出去了绰上,其實這里還有很多屬性旨怠,包括店鋪評價啥的,這里我們就不一一展示了蜈块。
@Override
public void onGetPoiDetailResult(PoiDetailResult result) {
if (result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(PoiInfoActivity.this, "抱歉鉴腻,未找到詳情結(jié)果", Toast.LENGTH_SHORT)
.show();
} else {
startActivity(new Intent(PoiInfoActivity.this,PoiDetailActivity.class).putExtra("URL",result.detailUrl));
}
}
那么poi檢索到這里也就算結(jié)束了
總結(jié)
百度地圖檢索功能包含的內(nèi)容還是很多的,這里我只拿poi舉個栗子百揭,當(dāng)然還有更多的我也不會丟下的爽哎,可能在以后的學(xué)習(xí)過程中會補(bǔ)充上去。