Google Maps Android API V2覚書(地図処理系)


Google Maps Android API V2を使ってみる」、「Google Maps Android API V2を使ってみる2」では、Google Mapsの表示のみをやってみました。
ここでは、地図関連のv2の機能を実装します。
メモみたいなものですが………。


イベント処理

情報表示・入力用のActivityを追加

カスタム・インフォウィンドウ


イベント処理

地図をタップ

地図上でタップした時、その位置を取得してToastで表示してみます。

MainActivity.java

import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import android.widget.Toast;
@Override
protected void onResume(){

    super.onResume();

    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

    if (resultCode == ConnectionResult.SUCCESS){
        ・
        ・
        ・
        ・
        gMap.setOnMapClickListener(new OnMapClickListener() {
            @Override
            public void onMapClick(LatLng point) {
                String posinfo = "clickpos\n" + "latitude=" + point.latitude + ", longitude=" + point.longitude;
                Toast.makeText(getApplicationContext(), posinfo, Toast.LENGTH_LONG).show();
            }
        });
    }
}

地図を長押し

MainActivity.java

 import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; 
 import android.widget.Toast; 

@Override
protected void onResume(){

    super.onResume();

    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

    if (resultCode == ConnectionResult.SUCCESS){
        ・
        ・
        ・
        ・
        gMap.setOnMapLongClickListener(new OnMapLongClickListener() {
            @Override
            public void onMapLongClick(LatLng point) {
                
                Toast.makeText(getApplicationContext(), "LongClick", Toast.LENGTH_LONG).show();
            }
        });
    }
}

フリースクロールしてカメラが移動した時の位置を取得してToastで表示

位置はmoveendした時のものです。

MainActivity.java

 import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener; 
 import android.widget.Toast; 

@Override
protected void onResume(){

    super.onResume();

    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

    if (resultCode == ConnectionResult.SUCCESS){
        ・
        ・
        ・
        ・
        gMap.setOnCameraChangeListener(new OnCameraChangeListener() {
            @Override
            public void onCameraChange(CameraPosition position) {
                LatLng point = position.target;
                String posinfo = "latitude=" + point.latitude + ", longitude=" + point.longitude;
                
                Toast.makeText(getApplicationContext(), posinfo, Toast.LENGTH_LONG).show();
            }
        });
    }
}

情報表示・入力用のActivityを追加

メニュで開きます。

gmap_androidapiv2II_memo

infoのフィールドに入れた情報はMainに戻った時、Toastで表示されます。

メニュのFile -> New で新しいClass(infoActivity.java)を追加。

AndroidManifest.xmlにactivityを追加。

resフォルダーにdrawableフォルダーを追加して、この中にボタン用画像(return.png)を追加。

以下の「com.example」(パッケージ名)は適当に読み替えてください。

MainActivity.java

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.AlertDialog;
import android.util.Log;
import android.widget.Toast;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.ConnectionResult;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.model.CameraPosition;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;

//カメラ移動イベント
import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener;

import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.LatLng;

//
import android.content.Intent;


public class MainActivity extends FragmentActivity {
    
    private SupportMapFragment mapFragment;
    private static final String HOGE_MAP_FRAGMENT_TAG = "maps_fragment";

    private GoogleMap gMap;

    private static final int MENU_A = 0;
    private static final int MENU_B = 1;
    private static final int MENU_C = 2;

    private static final int RQS_GooglePlayServices = 1;

    private String posinfo = "";

    //
    private static final int INFOACTIVITY = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        //地図表示
    FragmentManager fManager = getSupportFragmentManager();
    Fragment fragment = fManager.findFragmentByTag(HOGE_MAP_FRAGMENT_TAG);
    mapFragment = (SupportMapFragment)fragment;
    if (mapFragment == null) {

        //オプション
        GoogleMapOptions gOption = new GoogleMapOptions();
        gOption.compassEnabled(true);
        gOption.rotateGesturesEnabled(true);
        gOption.scrollGesturesEnabled(true);
        gOption.tiltGesturesEnabled(true);

        //SupportMapFragment
        mapFragment = SupportMapFragment.newInstance(gOption);

        //FragmentTransaction
        FragmentTransaction fTransaction = fManager.beginTransaction();
        fTransaction.add(android.R.id.content, mapFragment, HOGE_MAP_FRAGMENT_TAG);
        fTransaction.commit();
        
        
        
    }        
        
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.activity_main, menu);
        
        menu.add(0, MENU_A,   0, "Home");
        menu.add(0, MENU_B,   0, "Legal Notices");
        menu.add(0, MENU_C,   0, "CameraInfo");
        
        return true;
    }
    
    //
    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {  
        super.onActivityResult(requestCode, resultCode, intent);  

        if (requestCode == INFOACTIVITY){
            if (resultCode == RESULT_OK){
                Bundle extras = intent.getExtras();
                if (extras != null){
                    show_toast("infoActivityで入力した値:" + extras.getString("INFO_VALUE"));
                      
                }else{
                    show_toast("infoActivityで入力した値:" + "extra is null");
                    
                }
            }
        }else{
            show_toast("infoActivityで入力した値:");
        }
    }
        

    public boolean onOptionsItemSelected(MenuItem item) {
        switch ( item.getItemId() )
        {
            case MENU_A:
                //復帰
                LatLng HOME = new LatLng(35.02878398517723,135.77929973602295);
                moveCamera2Target(true,HOME,18.0f,60.0f,0.0f);
                
                return true;
                
            case MENU_B:
                //Legal Notices(免責事項)
                String LicenseInfo = GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo(getApplicationContext());
                AlertDialog.Builder LicenseDialog = new AlertDialog.Builder(MainActivity.this);
                LicenseDialog.setTitle("Legal Notices");
                LicenseDialog.setMessage(LicenseInfo);
                LicenseDialog.show();

                return true;
            
            case MENU_C:
                
                //
                Intent intent = new Intent(this,infoActivity.class);
                intent.putExtra("MAIN_VALUE", posinfo);
                startActivityForResult(intent, INFOACTIVITY);
                
                return true;
            
                
            }
        return false;
    }
    
    @Override
    protected void onResume(){

        super.onResume();

        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());

        if (resultCode == ConnectionResult.SUCCESS){
            Toast.makeText(getApplicationContext(), 
            "isGooglePlayServicesAvailable SUCCESS", 
            Toast.LENGTH_LONG).show();

                //GoogleMaps
                gMap = mapFragment.getMap();
                gMap.setIndoorEnabled(true);
                gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                gMap.setMyLocationEnabled(true);
                gMap.setTrafficEnabled(true);
                
                //初期位置
                LatLng target = new LatLng(35.02878398517723,135.77929973602295);
                
                //ズームレベル 1.0~19.0 無段階
                float zoom = 18.0f;
                
                //チルトアングル
                 float tilt = 90.0f; // 0.0 - 90.0
                
                //向き 0~360
                float bearing = 0.0f;
                
                // CameraUpdate
                CameraPosition pos = new CameraPosition(target, zoom, tilt, bearing);
                CameraUpdate camera = CameraUpdateFactory.newCameraPosition(pos);
                
                gMap.moveCamera(camera);
                
                //UiSettings
                UiSettings uiSet = gMap.getUiSettings();
                uiSet.setZoomControlsEnabled(true);
                uiSet.setZoomGesturesEnabled(true);
                uiSet.setCompassEnabled(true);
                uiSet.setRotateGesturesEnabled(true); 
                
                //イベントリスナーをセット
                
                //カメラ移動イベント
                gMap.setOnCameraChangeListener(new OnCameraChangeListener() {
                    @Override
                    public void onCameraChange(CameraPosition position) {
                        LatLng point = position.target;
                        posinfo = "latitude=" + point.latitude + ", longitude=" + point.longitude;
                        Toast.makeText(getApplicationContext(), posinfo, Toast.LENGTH_LONG).show();
                    }
                });
                
                
        }else{
            GooglePlayServicesUtil.getErrorDialog(resultCode, this, RQS_GooglePlayServices);
            
        }
    }
    

    private void moveCamera2Target(boolean animation_effect,LatLng target,float zoom,float tilt,float bearing) {
        CameraPosition pos = new CameraPosition(target, zoom, tilt, bearing);
        CameraUpdate camera = CameraUpdateFactory.newCameraPosition(pos);
        
        
        
        if (animation_effect == true) {
            //
            gMap.animateCamera(camera);
        } else {
            //
            gMap.moveCamera(camera);
        }
    }

    private void show_toast(String mes){
        Toast.makeText(MainActivity.this, 
            mes, 
            Toast.LENGTH_LONG).show();
    }

}

infoActivity.java

import android.app.Activity;  
import android.content.Intent; 
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;    
import android.widget.EditText;  
import android.widget.ImageButton;
import android.widget.TextView;
import android.util.Log;

//
import android.widget.LinearLayout;
import android.view.View.OnClickListener;
import android.view.WindowManager.LayoutParams;
import android.widget.TextView.BufferType;

public class infoActivity extends Activity {
    //
    private EditText edittext;
    private TextView textview;
    
    @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);
            
            //----------------------------------
            LinearLayout linear_LayoutL1 = new LinearLayout(this);
            linear_LayoutL1.setOrientation(LinearLayout.VERTICAL);
            linear_LayoutL1.setGravity(Gravity.TOP|Gravity.CENTER);
            addContentView(linear_LayoutL1, new LayoutParams());
            
            LinearLayout linear_LayoutL2 = new LinearLayout(this);
            linear_LayoutL2.setOrientation(LinearLayout.VERTICAL);
            linear_LayoutL2.setGravity(Gravity.CENTER|Gravity.CENTER);
            addContentView(linear_LayoutL2, new LayoutParams());
            
            LinearLayout linear_LayoutC = new LinearLayout(this);
            linear_LayoutC.setOrientation(LinearLayout.VERTICAL);
            linear_LayoutC.setGravity(Gravity.BOTTOM|Gravity.CENTER);
            addContentView(linear_LayoutC, new LayoutParams());
            
            
            textview = new TextView(this);
            textview.setText("GPS information");
            linear_LayoutL1.addView(textview, new LinearLayout.LayoutParams(350,200));
            
            
            
            
            edittext = new EditText(this);
            edittext.setText("info",BufferType.NORMAL);
            edittext.setHeight(50);
            edittext.setEnabled(true);
            edittext.setFocusableInTouchMode(true);
            linear_LayoutL2.addView(edittext, new LinearLayout.LayoutParams(300,70));
            
            
            
            ImageButton imgbtn_A  = new ImageButton(this);
            imgbtn_A.setImageResource(R.drawable.return);
            imgbtn_A.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    buttonReturn_OnClickListener(v);
                }
            });   
            linear_LayoutC.addView(imgbtn_A, new LinearLayout.LayoutParams(120,120));
            
            
            //----------------------------------
            
            
            //MainActivityから受け取った値を表示します。  
            
            
            Intent intent = getIntent();  
            Bundle extras = intent.getExtras();  
            if (extras != null){  
                textview.setText("Mapsで取得した値:\n"+extras.getString("MAIN_VALUE"));  
            }else{  
                textview.setText("Mapsで取得した値:\n" + "extra is null");     
            }
        
    }
    
    
    /* 
    * ボタンクリック処理 
    */  
    private void buttonReturn_OnClickListener(View v) {  
        //EditText textInput = (EditText)findViewById(R.id.textSub);  
        Intent intent = new Intent();  
        intent.putExtra("INFO_VALUE", edittext.getText().toString());  
        setResult(RESULT_OK,intent);  
        finish();  
    }  
}

AndroidManifest.xml

<activity
     android:name="com.example.infoActivity">
</activity>

カスタム・インフォウィンドウ

infoWindowをカスタマイズしたクラスを作って、吹き出しに画像を貼り付けてみます。

インポート

import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

Layoutに以下のようなxmlを作成

customInfoWindow.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    
     >

    <ImageView
        android:id="@+id/emblem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="5dp"
        android:adjustViewBounds="true" >
    </ImageView>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    
        android:background="@drawable/infowin_back"//吹き出しのバック画像、不要なら削除
        android:orientation="vertical" >

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:ellipsize="end"
            android:singleLine="true"
            android:textSize="14dp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/snippet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:singleLine="true"
            android:textSize="14dp" />
            
        
    </LinearLayout>

</LinearLayout>

MainActivity.java

以下のようなクラスを記述

private class CustomInfoAdapter implements InfoWindowAdapter {
        private final View mWindow;
        //constructor
        public CustomInfoAdapter() {
            mWindow = getLayoutInflater().inflate(R.layout.customInfoWindow, null);
        }
    
        @Override
        public View getInfoWindow(Marker marker) {
            show_infowin(marker, mWindow);
            return mWindow;
        }
    
        @Override
        public View getInfoContents(Marker marker) {
            return null;
        }
        
        private void show_infowin(Marker marker, View view) {
            //タップされたMarkerをチェック
            if (marker.equals(cMarker2)) {
                //画像は、res/drawableに入れておきます
                ImageView emblem = (ImageView) view.findViewById(R.id.emblem);
                emblem.setImageResource(R.drawable.gambaemblem);
        
        	//タイトル
                TextView title = (TextView) view.findViewById(R.id.title);
        	//スニペット
                TextView snippet = (TextView) view.findViewById(R.id.snippet);
                //setTextの内容は、マーカー作成時のoptionから引いています
                title.setBackgroundColor(Color.BLUE);
                title.setText(marker.getTitle());
                snippet.setTextColor(Color.BLUE);
                snippet.setText(marker.getSnippet());
            }
            
        }
}

このクラスをマーカーにセット

gMap.setInfoWindowAdapter(new CustomInfoAdapter());

これでマーカーをタップすると、画像付きのinfoWindowが表示されます。


 

Be the first to comment

Leave a Reply

Your email address will not be published.


*