我已经实现了一个类似于uber应用程序的地图,即pin在中心,地图在pin下拖动,pin从地图中获取位置。但是我不能实现触摸事件来切换操作栏,只是Uber-do而已。请帮助我实现该功能。首先,我使用了支持映射片段,但要设置触摸事件,需要一个视图,因此稍后我使用了映射视图。下面是我的代码:

package com.example.myfastapp;

import java.util.List;
import java.util.Locale;

import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.IntentSender.SendIntentException;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class mapFragment extends Fragment implements LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    MapView mapView;
    //private View touch;
    private GoogleMap map;
    private LatLng center;
    private LatLng currentpoint;

    private Geocoder geocoder;
    private List<Address> addresses;

    double latitude;
    double longitude;
    protected Context context;
    SupportMapFragment mf;
    View v;
    private static final CharSequence[] MAP_TYPE_ITEMS = { "Road Map",
            "Satellite", "Terrain" };

    // A request to connect to Location Services
    private LocationRequest mLocationRequest;
    private TextView markerText, Address;
    private LinearLayout markerLayout;

    private GoogleApiClient mGoogleApiClient;
    boolean mUpdatesRequested = false;

    private GPSTracker gps;

    // Milliseconds per second
    public static final int MILLISECONDS_PER_SECOND = 1000;

    // The update interval
    public static final int UPDATE_INTERVAL_IN_SECONDS = 5;

    // A fast interval ceiling
    public static final int FAST_CEILING_IN_SECONDS = 1;

    // Update interval in milliseconds
    public static final long UPDATE_INTERVAL_IN_MILLISECONDS = MILLISECONDS_PER_SECOND
            * UPDATE_INTERVAL_IN_SECONDS;

    // A fast ceiling of update intervals, used when the app is visible
    public static final long FAST_INTERVAL_CEILING_IN_MILLISECONDS = MILLISECONDS_PER_SECOND
            * FAST_CEILING_IN_SECONDS;

    public mapFragment(Context context) {
        super();
        this.context = context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        v = inflater.inflate(R.layout.mapfragment, container, false);



//      v.setOnDragListener(new MyDragListener());

        mapView = (MapView)v.findViewById(R.id.mapview);
        mapView.onCreate(savedInstanceState);





        ImageButton mapType = (ImageButton) v.findViewById(R.id.mapType);
        mapType.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                showMapTypeSelectorDialog();

            }
        });

        ImageButton myLocationCustomButton = (ImageButton)v.findViewById(R.id.myLocationCustom);
        myLocationCustomButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                gps = new GPSTracker(getActivity());
                gps.canGetLocation();
                latitude = gps.getLatitude();
                longitude = gps.getLongitude();
                currentpoint = new LatLng(latitude, longitude);

                CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(currentpoint, 18);
                map.animateCamera(cameraUpdate);
                map.setMyLocationEnabled(true);


            }
        });



        markerText = (TextView) v.findViewById(R.id.locationMarkertext);
        Address = (TextView) v.findViewById(R.id.adressText);
        markerLayout = (LinearLayout) v.findViewById(R.id.locationMarker);

        // Getting Google Play availability status
        int status = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(context);

        if (status != ConnectionResult.SUCCESS) { // Google Play Services are
                                                    // not available
            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status,
                    getActivity(), requestCode);
            dialog.show();

        } else {
            // Google Play Services are available

            // Getting reference to the SupportMapFragment
            // Create a new global location parameters object
            mLocationRequest = LocationRequest.create();

            /*
             * Set the update interval
             */
            mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);

            // Use high accuracy
            mLocationRequest
                    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

            // Set the interval ceiling to one minute
            mLocationRequest
                    .setFastestInterval(FAST_INTERVAL_CEILING_IN_MILLISECONDS);

            // Note that location updates are off until the user turns them on
            mUpdatesRequested = false;

            /*
             * Create a new location client, using the enclosing class to handle
             * callbacks.
             */
            mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                    .addApi(LocationServices.API).addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();

            mGoogleApiClient.connect();
        }

        return v;

    }





    public void toggleActionBar()
    {
        ActionBar ab = getActivity().getActionBar();

        if (ab != null)
        {
            if (ab.isShowing())
            {
                ab.hide();
            }
            else
            {
                if(!ab.isShowing())
            {
                ab.show();
            }
            }
        }
    }

    private void setupMap() {
        try {
            /*map = ((SupportMapFragment) this.getChildFragmentManager()
                    .findFragmentById(R.id.map)).getMap();*/




            map = mapView.getMap();



            // Enabling MyLocation in Google Map
            map.setMyLocationEnabled(true);
            map.getUiSettings().setZoomControlsEnabled(true);
            map.getUiSettings().setMyLocationButtonEnabled(false);
            map.getUiSettings().setCompassEnabled(false);
            map.getUiSettings().setRotateGesturesEnabled(true);
            map.getUiSettings().setZoomGesturesEnabled(true);

            try {
                MapsInitializer.initialize(this.getActivity());
            } catch (Exception e) {
                e.printStackTrace();
            }


            PendingResult<Status> result = LocationServices.FusedLocationApi
                    .requestLocationUpdates(mGoogleApiClient, mLocationRequest,
                            new LocationListener() {
                                @Override
                                public void onLocationChanged(Location location) {
                                    markerText.setText("Location received: "
                                            + location.toString());

                                }
                            });

            Log.e("Reached", "here");
            result.setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {

                    if (status.isSuccess()) {

                        Log.e("Result", "success");

                    } else if (status.hasResolution()) {
                        // Google provides a way to fix the issue
                        try {
                            status.startResolutionForResult(getActivity(), 100);
                        } catch (SendIntentException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            gps = new GPSTracker(getActivity());
            gps.canGetLocation();
            latitude = gps.getLatitude();
            longitude = gps.getLongitude();
            currentpoint = new LatLng(latitude, longitude);

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(currentpoint).zoom(16f).tilt(30).bearing(90).build();

            map.setMyLocationEnabled(true);
            map.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));
            map.clear();

            map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {

                @Override
                public void onCameraChange(CameraPosition arg0) {
                    // TODO Auto-generated method stub
                    //toggleActionBar();
                    center = map.getCameraPosition().target;

                    markerText.setText(" Set your Location ");
                    map.clear();
                    markerLayout.setVisibility(View.VISIBLE);

                    try
                    {
                        new GetLocationAsync(center.latitude, center.longitude)
                                .execute();

                    } catch (Exception e) {
                    }
                }
            });




            markerLayout.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                    try {
                        LatLng latLng1 = new LatLng(center.latitude,
                                center.longitude);

                        Marker m = map.addMarker(new MarkerOptions()
                                .position(latLng1)
                                .title(" Set your Location ")
                                .snippet("")
                                .icon(BitmapDescriptorFactory
                                        .fromResource(R.drawable.my_location)));
                        m.setDraggable(true);

                        markerLayout.setVisibility(View.GONE);
                    } catch (Exception e) {
                    }
                }
            });



        } catch (Exception e) {
            e.printStackTrace();
        }

    }



    @Override
    public void onConnectionFailed(ConnectionResult result) {
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        setupMap();
    }

    @Override
    public void onConnectionSuspended(int cause) {
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    private class GetLocationAsync extends AsyncTask<String, Void, String> {
        // boolean duplicateResponse;
        double x, y;
        StringBuilder str;

        public GetLocationAsync(double latitude, double longitude) {
            // TODO Auto-generated constructor stub

            x = latitude;
            y = longitude;
        }

        @Override
        protected void onPreExecute() {
            Address.setText(" Getting location ");
        }

        @Override
        protected String doInBackground(String... params) {
            try {
                geocoder = new Geocoder(context, Locale.ENGLISH);
                addresses = geocoder.getFromLocation(x, y, 1);
                str = new StringBuilder();
                if (Geocoder.isPresent()) {
                    Address returnAddress = addresses.get(0);

                    String localityString = returnAddress.getLocality();
                    String city = returnAddress.getCountryName();
                    String region_code = returnAddress.getCountryCode();
                    String zipcode = returnAddress.getPostalCode();

                    str.append(localityString + " ");
                    str.append(city + " " + region_code + " ");
                    str.append(zipcode + " ");

                }

            } catch (Exception e) {

                Log.e("tag", e.getMessage());
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            try {
                Address.setText(addresses.get(0).getAddressLine(0) + ", "
                        + addresses.get(0).getAddressLine(1) + " ");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void onProgressUpdate(Void... values) {

        }
    }

    /*
     * public void addMarker(double lati, double longi) {
     *
     * LatLng latlng = new LatLng(lati, longi);
     *
     * MarkerOptions mo = new MarkerOptions(); mo.position(latlng);
     * mo.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_location));
     * mo.title("My Location:"+ latlng); map.addMarker(mo);
     *
     * //map.moveCamera(CameraUpdateFactory.newLatLngZoom(latlng,
     * 15));//previous code CameraPosition cameraPosition = new
     * CameraPosition.Builder() .target(latlng) .zoom(11.0f) .bearing(90) //
     * Orientation of the camera to east .tilt(30) // Tilt of the camera to 30
     * degrees .build();
     * map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
     * map.setMyLocationEnabled(true);
     * map.getUiSettings().setCompassEnabled(true);
     * map.getUiSettings().setZoomControlsEnabled(true);
     * //map.setMapType(GoogleMap.MAP_TYPE_NORMAL); }
     */

    public void showMapTypeSelectorDialog() {
        // Prepare the dialog by setting up a Builder.
        final String fDialogTitle = "Select Map Type";
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle(fDialogTitle);
        // Find the current map type to pre-check the item representing the
        // current state.
        int checkItem = map.getMapType() - 1;
        System.out.print(checkItem);
        // Add an OnClickListener to the dialog, so that the selection will be
        // handled.
        builder.setSingleChoiceItems(MAP_TYPE_ITEMS, checkItem,
                new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int item)
                    {
                        // Locally create a finalised object.
                        // Perform an action depending on which item was
                        // selected.
                        switch (item)
                        {
                        case 1:
                            map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                            break;
                        case 2:
                            map.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
                            break;
                        default:
                            map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                        }
                        dialog.dismiss();
                    }
                });

        // Build the dialog and show it.
        AlertDialog fMapTypeDialog = builder.create();
        fMapTypeDialog.setCanceledOnTouchOutside(true);
        fMapTypeDialog.show();
    }

     @Override
     public void onResume()
     {

         super.onResume();

         mapView.onResume();
         mapView.getMap();


     }

     @Override
     public void onPause()
     {
         super.onPause();
         mapView.onPause();

     }


     @Override
     public void onLowMemory()
     {
         super.onLowMemory();
         mapView.onLowMemory();
     }

}

最佳答案

onCameraChangeListener已被弃用,但好消息是google已经发布了3个新的侦听器。
参阅:GoogleMap.OnCameraChangeListener
此接口已弃用。
替换为GoogleMap.OnCameraMoveStartedListenerGoogleMap.OnCameraMoveListenerGoogleMap.OnCameraIdleListener。不推荐的onCameraChange方法相对于新相机更改侦听器中的方法的调用顺序是未定义的。
我已经使用了这些侦听器,现在我可以在map上获取hold-and-release事件。

关于android - 如何像Uber一样触摸 map 时切换操作栏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35811495/

10-10 10:08