会社でも1日PCとにらめっこ、家に帰ってもPCはやはり疲れますね。
ベースにしたプログラムは、日本Androidの会のHP上にある、勉強会資料です。
頭から読んでその通りにプログラムすれば、GPSで現在地を表示するところまでは簡単にできるので、割愛します。
自分が作りたかったのは、地図表示ではなく、現在地が移動したら、累積距離を積算し、画面表示するプログラムです。
まず、画面上に累積距離を表示する領域を設けます。
res/layout/main.xmlを以下のように編集します。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
android:background="@android:color/white"
android:textSize="12pt"
/>
<com.google.android.maps.MapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="*******************"
/>
</LinearLayout>
日本Androidの会のプログラムに対して追加したのは、TextViewです。
これで、マップ上部にテキスト表示領域が設けられます。
次に、HelloGpsActivityクラスにフィールドを追加します。
float totalDistance = 0;
Location old_location = null;
距離を求めるための旧位置情報を残しておく変数と、累積距離をとっておく変数です。
次に、新しい位置情報と古い位置情報、累積距離を引数にして、表示領域に累積距離を表示するメソッドを追加します。
何の機能を担っているのかイマイチ不明になってしまいますが、戻り値で更新した累積距離を戻すようにしました。(動けばいいんです、動けば…というか関数化必要ないかも?)
private float addTotalDistance(Location n,Location o,float td){
TextView textView = (TextView)findViewById(R.id.TextView01);
if(o!=null){
td += n.distanceTo(o);
}
textView.setText(Float.toString(td)+" m");
return td;
}
後は、位置情報更新のたびに呼び出されるメソッドで、追加したメソッドを実行し、メンバ変数の旧位置情報を上書きするようにするだけ。
this.totalDistance = addTotalDistance(location,this.old_location,this.totalDistance);
this.old_location = location;
外をうろうろしてみると、積算距離が加算されていきます。
ソースコードはこんな感じ
package jp.hews.hellogps;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.ZoomControls;
import android.widget.TextView;
public class HelloGpsActivity extends MapActivity implements LocationListener {
/** Called when the activity is first created. */
//フィールドを追加する。
MapController m_controller;
float totalDistance = 0;
Location old_location = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 現在位置が変化したら、このメソッドが呼び出されるように登録する。
LocationManager l =
(LocationManager)getSystemService(Context.LOCATION_SERVICE);
l.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
// マップに現在位置を表示する。
MapView m = (MapView)findViewById(R.id.mapview);
m_controller = m.getController();
m_controller.setZoom(15);
@SuppressWarnings("deprecation")
ZoomControls zc = (ZoomControls)m.getZoomControls();
zc.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT
, ViewGroup.LayoutParams.FILL_PARENT));
zc.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
m.addView(zc);
}
private float addTotalDistance(Location n,Location o,float td){
TextView textView = (TextView)findViewById(R.id.TextView01);
if(o!=null){
td += n.distanceTo(o);
}
textView.setText(Float.toString(td)+" m");
return td;
}
@Override
protected boolean isRouteDisplayed() {
// TODO 自動生成されたメソッド・スタブ
return false;
}
@Override
public void onLocationChanged(Location location) {
GeoPoint gp =
new GeoPoint((int)(location.getLatitude()*1E6),
(int)(location.getLongitude()*1E6));
m_controller.animateTo(gp);
this.totalDistance =
addTotalDistance(location,this.old_location,this.totalDistance);
this.old_location = location;
}
@Override
public void onProviderDisabled(String provider) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void onProviderEnabled(String provider) {
// TODO 自動生成されたメソッド・スタブ
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO 自動生成されたメソッド・スタブ
}
}
次は、蓄えておいた距離情報に、累積距離が等しくなったら何らかの合図が出るようにします。
え?
こんな単純なプログラムどこで詰まっていたかって?
いやん、恥ずかしいからナ・イ・ショ。
マーケットにはいつ?
返信削除まずは機能を満たしたものを作らないといかんですね。
返信削除