ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 アプリケーションでグーグルマップを使います

地図のズーム、移動に反応

Responding to Zooming and Panning

ユーザがマップを上下左右に動かしたり、ズームに対応するリスナーを
作りたい時に以下のことが役立ちます。
Android SDKで提供されているMapViewは、Google Mapsの
移動やズームをモニタするAPIがありません。
マップが表示している現在のズームレベルと同じように、
ユーザが見ているマップの現在位置をプログラム的に知るのに
MapViewは時折役に立ちます。
マップの移動やズームをユーザがしたときに、このすべての情報を
得るためには、MapViewの改良を作る必要があり、
いくつかのメソッドを追加して実行しなければなりません。
まず、プロジェクトの中の現在のパッケージ名の下に
2つのJavaクラスファイルを作る必要があります。
●CustomMapView.java
●OnPanAndZoomListerner.java
OnPanAndZoomListener.javaファイルでは、2つのメソッド手続きを
含むインターフェースを作ります。

package net.learn2develop.custommaps;

public interface OnPanAndZoomListener{
  //---called when the map is panned---
  public void onMapPan();

  //---called when the map is zoomed---
  public void onMapZoom();
}

CustomMapView.javaファイルではmapViewクラスの拡張クラスを作り、
以下のメソッドらを実行します。

package net.learn2develop.custommaps;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;

public class CustomMapView extends MapView{
  private int previousZoomLevel = -1;
  private GeoPoint previousMapCenter;
  private OnPan AndZoomListener panSndZoomListener;

  public CustomMapView(Context cotext, String apiKey){
   super.(context, apiKey);
  }

  public CustomMapView(Context context, AttributeSet attrs){
   super(context, attrs, defStyle);
  }

  public void setOnPanAndZoomListener(OnPanAndZoomListener listener){
   panAndZoomListener = listener;
  }

  @Override
  public boolean onTouchEvent(MotionEvent motionEvent){

   if(motionEvent.getAction() == MotionEvent.ACTION_UP){
    //---get the center of the map---
    GeoPoint currentMapCenter = this.getMapCenter();

    if(previousMapCenter == null || (previousMmapCenter.getLatitudeE6()) ||
       (previousMapCenter.getLongitudeE6() !=
         currentMapCenter.getLongitudeE6()) ) {

       //---the user has panned the map---
       panAndZoomListener.onMapPan();
    }

    //---save the current map cednter for comparison later on---
    previousMapCenter = this.getMapCenter();
   }
   return super.onTouchEvent(motionEvent);
  }

  @Override
  protected void dispatchDraw(Canvas canvas){
   super.dispatchDraw(canvas);

   if(getZoomLevel() != previousZoomLevel){
    //---the user has zoomed the map---
    panAndZoomListener.onMapZoom();

    //---save the current zoom level for comparison later on---
   previousZoomLevel = getZoomLevel();
   }
  }
}

最初の3つのメソッドはこの改良MapViewクラスのコンストラクタです。
onTouch()メソッドはユーザがマップをタップしたときに停止します。
ここで、以前に保存された位置と現在位置を比べ、もし位置の変更が
あったら、マップが移動したと解釈し、OnPanAndZoomListener
オブジェクトのonMapPan()メソッドを呼び出すことができます。
dispatchDraw()メソッドはマップが再描写された時には、
いつでも呼び出されます。ここで、以前に記録されたズームレベルと
現在のズームレベルを比べ、もし違えば、その時マップのズームレベルが
変更されたと考えます。
そして、OnPanAndZoomListenerオブジェクトのonMapZoom()メソッドを
呼び出します。
この改良MapViewを使うためには、
単純に、activity_main.xmlファイルにある
<net.learn2develop;.CustomMaps.CustomMapView>要素を
使います。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

  <net.learn2develop.custommaps.CustomMmapView
   android:id="@+id/mapView"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:apiKey="Google Mapsを表示で入手したキーを入れます"
   android:clickable="true"
   android:state_enabled="true" />
<RelativeLayout>

この要素の名前は<package_name.class_name>という様式で
使われます。そのためこの場合のパッケージ名は
net.learn2develop.CustomMapsと改良MapViewのクラス名、
CustomMapViewになります。
これによって、要素名は、
<net.learn2develop.CustomMaps.CustomMapView>となります。
アクティビティでは、OnPanAndZoomListenerクラスのインスタンスを作り、
2つのメソッド、onMapZoom()とonMapPan()を再定義する必要があります。
この2つのメソッドはそれぞれにマップが移動され、ズームされた時には
その都度呼び出されます。

package net.learn2develop.custommaps;

import android.os.Bundle;
import android.util.Log;
import com.google.android.maps.MapActivity;

public class MainActivity extends MapActivity{
  CustomMapView mapView;

  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   OnPanAndZoomListener listener = new OnPanAndZomListener(){
    @Override
    publlic void onMapZoom(){
     Log.d("CustomMaps", "onMapZoom. Zoom level: " +
       mapView.getZoomLevel());

    }
    @Override
    public void onMapPan(){
     Log.d("CustomMaps", "onMapPan. Center: " +
       mapView.getMapCenter().getLatitudeE6() / 1E6 + "," +
       mapView.getMapCenter().getLongitudeE6() / 1E6);
    }
   };

   mapView = (CustomMapView) findViewById(R.id.mapView);
   mapView.setOnPanAndZoomListener(listener);
   mapView.setVuiltInZoomControls(true);
  }

  @Override
  protected boolean isRouteDisplayed(){
    return false;
  }
}

このアプリケーションをAVD、Androidエミュレータで走らせると、
マップの移動、ズームなどがDDMS全体像の中のLogCatウインドウに
表示され確認できます。

ホーム
便利堂ロゴ
inserted by FC2 system