2016-03-05 70 views
4

我實現了一個圖,行爲像Uber應用即銷中心和地圖針拖動下,銷從地圖中獲取的位置。但是我無法實現觸摸事件來切換操作欄,就像Uber一樣。請幫助我實現該功能。首先,我已經使用支持地圖片段,但設置一個看法是必需的,這樣以後我用MapView.Below觸摸事件是我的代碼:如何切換動作條,而觸摸地圖像尤伯杯

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(); 
    } 

} 
+0

你能解釋一下你不能做的優步嗎?可能張貼截圖?如果我確切地知道你想要什麼,我可以幫助你更好。 –

+1

當我們點擊地圖將地圖上的銷釘移動到地圖上時,我們手動設置的工具欄將會隱藏起來。當我們從屏幕上拿走我們的手時,操作欄將返回。這就是他實際上意味着,能不能請你幫 –

+0

你有針對 –

回答

0

我相信你應該添加一個onMarkerDragListener到地圖的對象,做你的代碼內。

map.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() { 
       @Override 
       public void onMarkerDragStart(Marker marker) { 

       } 

       @Override 
       public void onMarkerDrag(Marker marker) { 

       } 

       @Override 
       public void onMarkerDragEnd(Marker marker) { 

       } 
      }); 
+0

它不工作 –

+0

或許檢查[這](http://stackoverflow.com/a/27016907/3484905)出來。 – MohanadMohie

3

onCameraChangeListener已被棄用,但好消息是,谷歌已經發布了3名新的聽衆。

請參見:GoogleMap.OnCameraChangeListener

此接口已被否決。

替換爲GoogleMap.OnCameraMoveStartedListenerGoogleMap.OnCameraMoveListenerGoogleMap.OnCameraIdleListener。與新相機更改偵聽器中的方法有關的將被調用的不推薦使用的onCameraChange方法的順序未定義。

我已經使用這些監聽器,現在我可以在地圖上獲取暫停和釋放事件。

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

<fragment 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    /> 

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="?attr/colorPrimary"/> 

<ImageButton 
    android:id="@+id/fabButton" 
    android:layout_width="56dp" 
    android:layout_height="56dp" 
    android:layout_gravity="bottom|right" 
    android:layout_marginBottom="16dp" 
    android:layout_marginRight="16dp" 
    android:background="@drawable/fab_bcg" 
    android:src="@drawable/ic_favorite_outline_white_24dp" 
    android:contentDescription="Desc"/> 

這是作秀的方法和隱藏的觀點 私人無效hideViews(){ mToolbar.animate()。translationY(-mToolbar.getHeight())。setInterpolator(新AccelerateInterpolator( 2));

FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mFabButton.getLayoutParams(); 
    int fabBottomMargin = lp.bottomMargin; 
    mFabButton.animate().translationY(mFabButton.getHeight()+fabBottomMargin).setInterpolator(new AccelerateInterpolator(2)).start(); 
} 

private void showViews() { 
    mToolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)); 
    mFabButton.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start(); 
}