package com.android_mvc.sample_project.activities.func_map; import java.util.ArrayList; import java.util.List; import android.location.Location; import android.widget.CheckBox; import android.widget.CompoundButton; import com.android_mvc.framework.activities.base.BaseMapActivity; import com.android_mvc.framework.controller.action.ActionResult; import com.android_mvc.framework.gps.MapLocationListener; import com.android_mvc.framework.ui.UIBuilder; import com.android_mvc.framework.ui.UIUtil; import com.android_mvc.framework.ui.view.MLinearLayout; import com.android_mvc.framework.ui.view.MTextView; import com.android_mvc.framework.ui.view.MToggleButton; import com.android_mvc.framework.ui.view.map.IconsOverlaySettings; import com.android_mvc.framework.ui.view.map.MMapView; import com.android_mvc.framework.ui.view.map.BaseOverlayItem; import com.android_mvc.sample_project.controller.FuncDBController; import com.android_mvc.sample_project.db.dao.LocationLogDAO; import com.android_mvc.sample_project.db.entity.LocationLog; /** * サンプルのMapアプリのアクティビティ。 * @author id:language_and_engineering * */ public class SampleMapActivity extends BaseMapActivity { MLinearLayout layout1; MLinearLayout layout2; MTextView tv1; MMapView map1; MToggleButton toggle1; // 位置情報のリスト List<LocationLog> locs; @Override public boolean requireProcBeforeUI(){ // UI構築前に処理を要求する return true; } // UI構築前に別スレッドで実行される処理 @Override public void procAsyncBeforeUI(){ // 全位置情報をDBからロード locs = new LocationLogDAO(this).findAll(); } @Override public void defineContentView() { final SampleMapActivity activity = this; new UIBuilder(context) .add( layout1 = new MLinearLayout(context) .widthFillParent() .heightPx(600) .add( // GoogleMap。 // 自分の現在地を追跡し,なおかつ足跡の履歴をアイコン表示する。 map1 = new MMapView(context) .widthFillParent() .heightFillParent() .touchable() .showZoomControl() .zoomToMaxDetail() // GPS関連 .followMyLocation() // 自分の現在地を追跡し続ける .gpsLookupPeriod( 10 * 1000 ) .onMyLocationChanged(new MapLocationListener(){ @Override public void onLocationChanged( Location location ) { UIUtil.longToast(context, "マップが現在位置の変更を検出。\n" + String.valueOf(location.getLatitude()) + "," + String.valueOf(location.getLongitude()) ); FuncDBController.submit(activity); } }) // マップ上に描画するアイコン関連 .setIconsOverlay( new IconsOverlaySettings() .setIconImage(android.R.drawable.sym_def_app_icon) .setItemsList( getLocationLogItemsList() ) ) ) , toggle1 = new MToggleButton(context) .textOn("現在地を追跡中") .textOff("現在地の追跡を開始する") .checked() .onCheck( new CheckBox.OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton src, boolean isChecked) { if( isChecked ) { map1.followMyLocation(); } else { map1.stopFollowMyLocation(); } } } ) , /* tv1 = new MTextView(context) .text("GPS常駐サービスで記録された現在位置の履歴が,\n下記に表示されます。↓\n" ) .widthFillParent() .heightWrapContent() , */ layout2 = new MLinearLayout(context) .widthFillParent() .heightWrapContent() .orientationVertical() ) .display(); // 位置情報をDBから表示 redrawRecentLocationRecords(); } /** * マップ上に描画すべきアイコンのリストを返す */ private List<BaseOverlayItem> getLocationLogItemsList() { List<BaseOverlayItem> items = new ArrayList<BaseOverlayItem>(); for( LocationLog loc : locs ) { items.add( loc.toMOverlayItem() ); } return items; } @SuppressWarnings("unchecked") @Override public void afterBLExecuted(ActionResult ares) { // DBからの検索結果に基づいて,DBリスト部分を再描画 locs = (List<LocationLog>) ares.get("recent_locations"); // TODO: redrawRecentLocationRecords(); // マップ上のアイコンも再描画 map1.updateIconsOnOverlay( getLocationLogItemsList() ); } /** * 画面上で,最新の位置レコード情報を再描画する。 */ private void redrawRecentLocationRecords() { /* TODO: // 中身をクリア layout2.removeAllIncludingViews(); // レイアウト内に位置情報を全件表示 for( LocationLog loc : locs ) { layout2.add( new MTextView(context) .text( loc.getDescription() ) // この位置情報の説明を取得 .widthFillParent() .heightWrapContent() ); } // 描画 layout2.inflateInside(); */ } @Override protected void onDestroy() { super.onDestroy(); map1.onActivityDestroy(); } }