2020年1月24日 星期五

地圖日記 | Android | Kotlin


最近想把籃球地圖app改成日記地圖app,這邊就順便紀錄一下開發的經過好惹。


這個日記地圖主要就是想實現個人在地圖上軌跡,在還沒有這個app前我的作法是使用google myMap上記錄去過的地方,然後使用blogger寫日記,最後把日記的連結貼到mymap的那個marker上,一來我就可以看出我整年的移動足跡,點擊某個marker可以看到我今年去過幾次,何時去的、和誰去的,還有那天的日記。


一般的日記,內容是重點,地點反而只是其中一項資料,但我想要的是一種連結土地的感覺,在哪年哪天和什麼人去了哪裡,然後在地圖上根據時間軸的操作,慢慢的冒出日記,具現化地理和感情的記憶。


實作上就是需要地圖、地點查詢、日記資料、人物資料、登入、資料雲端備份...等


最近主要功能都告一段落了,在local端可以使用,資料備份的部分就之後再說..


架構使用 MVVM ,DI 使用 koin,線程切換 coroutines ,db 使用 room,地圖跟 auth 都是google 的服務,大概是這樣。


本來想認真紀錄開發遇到的困難,但是遇到困難的時候只想解掉不想紀錄XD,解完之後也沒力紀錄了,之後就根據每個功能稍微說說



主畫面

地圖 + 日記瀏覽
主畫面就是在地圖上放上所有日記的marker,點marker會滑出bottomsheet,bottomsheet 裡面包含 viewpager 每一頁都是 recyclerview,當某個地點有多筆日記的話就可以左右滑來看日記。


日記的資料是使用room 返回 livedata,所以在後續的新增日記回到這邊,room都會自動幫我更新到最新資料,非常好用啊!


然後點每個 marker 的 infowindow 都會開啟 google map 的街景服務,使用者可以看到這個座標的畫面。


日記的內容就是在 recyclerview 裡顯示包括 地標名稱、日期、角色、文字與圖片,編輯與刪除日記一樣會響應到地圖上。


這邊遇到的問題是在 bottomsheet 中包 viewpager 再包 recyclerview,會遇到 viewpager 第二頁不能滑動的問題,解法就是自己客製化一個viewpager,因為 bottomsheet 預設只有第一個view可以滑動,所以 viewpager 滑動時將最後滑到的view指回給 bottomsheet。



新增日記

會先開啟一個新的地圖讓使用者選擇地點,有三種方式:新增地點、選擇原有的日記地點、搜尋地標功能。搜尋地標使用google place API,總之這頁最後會得到一個地點名稱與經緯度然後帶向下一頁。


日記的內容主要可以修改時間,選擇參與的角色,輸入文字或圖片,這邊使用的是 recyclerview,讓使用者可以依序添加內容。


這邊遇到的問題主要是要搞懂 place API 的收費標準,看來看去是沒有免費方案,但是每個月有200塊的扣打,然後就依照你要query的內容去收費,雖然這個app應該不會有人用,但是遇到要收費還是怕怕的。


第二個問題是 recyclerview 有不同 type 的 view ,只要新增一種 type,要改的地方就很多,尤其儲存資料要轉成 room 的資料格式,一開始想到什麼寫什麼,導致後面還要做很多重構的事情,hen 累。


第三個問題是因為有多個 editview,然後要監聽每個 editview,最後輸出的結果,在 viewholder 必須每次都先移除監聽器再新增,否則在item增加的時候會造成顯示順序混亂的問題。


最後一個問題就是圖片儲存的問題,之前工作的經驗圖片會先丟到server,但是我現在只需要將圖片存在本機,所以最後就開了一個資料夾複製一份使用者使用的圖片,因為是原圖複製所以勢必會使用多餘的容量,暫時也沒想到更好的方法...



觀看模式

呈現一個根據時間慢慢將日記加到地圖的畫面,這邊就要去熟悉一下 sql 的語法,平常工作幾乎不會用到太多,像是找某個值的最大與最小、拿介於某值與某值區間的 list 之類的。然後使用 coroutines 的 delay 配合 livedata 輕鬆達到 trigger 的效果。



角色

新增與修改角色,這邊遇到的問題是當角色被修改或被刪除時,主頁地圖上的日記裡面的角色資料要更新,但是角色跟日記是不同的表,所以似乎要使用 room relation 的功能去達到,但這時改這個簡直怕爆,衡量以後決定就在角色被刪除後回到主頁時,去加一篇日記到db 然後再刪除,達到 trigger db 更新的效果。



設定頁

一些會再設定頁出現的東西,在登出時,使用 CLEAR_TASK 加 NEW_TASK 將所有 activity 清掉,只留下登入頁的 activity。資料因為都沒有上雲,所以其實刪除資料就是把db清空而已XD,那其實還沒做備份根本不需要要求登入齁!


日記地圖 2.0 版的功能大概就這樣!接下來要幹嘛呢?前幾天去聽某7技術分享,對 openGL 跟直播也是蠻有興趣的,還有一大堆的custom view還是在把 coroutines 鑽深一點,畢竟也只會用一些簡單的功能...時間真的不夠用哪!


想要達到的功能就是日記撒在地圖上,根據或是tag或是參與的人物可以篩選出不同的樣貌。


App - 地圖日記


沒有留言:

張貼留言