2012-12-28 76 views
112

我的问题是,有谁知道如何设置谷歌地图,打开我的位置和放大视图?谷歌地图v2 - 设置我的位置和放大

目前,主视图向非洲开放,一路缩小。

所以我一直在寻找几天了,所有我能看到的是:

1)你不能动画两个东西(如缩放,去我的位置)在一个谷歌地图?所以,如果我能在设置动画之前弄清楚如何设置缩放比例,那么这个问题就可以解决。这往往是问题,你可以改变一个,但不能两个。

2)我发现了其他可能有用的类,但是如何设置代码没有帮助,所以类可以操纵谷歌地图。

这是我一直坚持到目前为止的代码,有些作品,有些没有。有些我认为稍后可能会有用。

package com.MYWEBSITE.www; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import android.content.Context; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.Menu; 

public class MainActivity extends FragmentActivity { 
private GoogleMap map; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_layout); 

    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
    map.setMyLocationEnabled(true); 

    //LocationSource a = (LocationSource) getSystemService(Context.LOCATION_SERVICE); 
    //LocationManager b = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    //map.setLocationSource(a); 

    Criteria criteria = new Criteria(); 
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    String provider = locationManager.getBestProvider(criteria, false); 
    Location location = locationManager.getLastKnownLocation(provider); 
    double lat = location.getLatitude(); 
    double lng = location.getLongitude(); 
    LatLng coordinate = new LatLng(lat, lng); 

    //CameraPosition.Builder x = CameraPosition.builder(); 
    //x.target(coordinate); 
    //x.zoom(13); 

    //Projection proj = map.getProjection(); 
    //Point focus = proj.toScreenLocation(coordinate); 

    //map.animateCamera(CameraUpdateFactory.newLatLng(coordinate)); 
    map.animateCamera(CameraUpdateFactory.zoomBy(13)); 
    //map.moveCamera(CameraUpdateFactory.newLatLng(coordinate)); 


    ////LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; 
} 
} 

回答

186

你不能动画两件事情(如放大,去我的位置)在一个谷歌地图?

从编码的角度看,你会做他们按顺序:

CameraUpdate center= 
     CameraUpdateFactory.newLatLng(new LatLng(40.76793169992044, 
               -73.98180484771729)); 
    CameraUpdate zoom=CameraUpdateFactory.zoomTo(15); 

    map.moveCamera(center); 
    map.animateCamera(zoom); 

在这里,我第一次移动相机,然后进行动画摄像头,虽然双方可能animateCamera()电话。是否GoogleMap将这些合并为一个事件,我不能说,因为它太快了。 :-)

Here is the sample project从中我拉上面的代码。


对不起,这个答案错误。请参阅Rob的答案,通过创建CameraPosition然后从CameraPosition创建CameraUpdate,从而一举实现这一目标。

+0

不应该接受的答案。 Mubeen1992答案是正确的。 – Matthew

+1

@AlanHaverty:我在答案中链接到的示例应用程序包含该代码。它运行得很好。我现在只是在运行Android 7.0的Nexus 9和运行Android 6.0.1的Nexus 6P上进行测试。它几年来运行得非常好。它*不会*一次完成,我同意Rob's是一个优越的答案,正如我在答案中所指出的那样。如果您认为您有证据表明此代码无效,请在某处发布示例项目。 – CommonsWare

+0

@CommonsWare我的道歉,在测试你的代码时,我的地图的左上角似乎是用lat lng设置的。我认为你错了.newLatLng()做了什么。我不确定它为什么关闭,它一定是我的最终结果,api文档证明了你的情况,对于你的答案开启触发感到抱歉! 删除我的第一条评论以避免混淆。 API来源:https://developers.google.com/android/reference/com/google/android/gms/maps/CameraUpdateFactory.html#newLatLng(com.google.android .gms.maps.model。LatLng) –

7

你也可以像设置两个参数,

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(21.000000, -101.400000) ,4)); 

这将定位你在一个特定的位置和缩放地图。我用这个来设置我的地图。

150

可以一次更改位置,缩放,方位和倾斜度。也可以在animatecamera调用上设置持续时间。

CameraPosition cameraPosition = new CameraPosition.Builder() 
    .target(MOUNTAIN_VIEW)  // Sets the center of the map to Mountain View 
    .zoom(17)     // Sets the zoom 
    .bearing(90)    // Sets the orientation of the camera to east 
    .tilt(30)     // Sets the tilt of the camera to 30 degrees 
    .build();     // Creates a CameraPosition from the builder 
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

看一看该文档在这里:

https://developers.google.com/maps/documentation/android/views?hl=fr-FR#moving_the_camera

+0

这一个去完美 – Noman

12

尝试以这种方式 -

public class SummaryMapActivity extends FragmentActivity implements LocationListener{ 

private GoogleMap mMap; 
private LocationManager locationManager; 
private static final long MIN_TIME = 400; 
private static final float MIN_DISTANCE = 1000; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.summary_mapview); 

    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .getMap(); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 
      mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
     } 
    } 
    mMap.setMyLocationEnabled(true); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME, MIN_DISTANCE, this); 


} 

@Override 
public void onLocationChanged(Location location) { 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15); 
    mMap.animateCamera(cameraUpdate); 
    locationManager.removeUpdates(this); 

} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 

}

+0

Thankx很多它帮助我:) –

49

这是你的问题

简单的解决方案
LatLng coordinate = new LatLng(lat, lng); 
CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 5); 
map.animateCamera(yourLocation); 
-2
gmap.animateCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(new LatLng(9.491327, 76.571404), 10, 30, 0))); 
3

它的答案很晚,但我认为这会有所帮助。使用此方法:

protected void zoomMapInitial(LatLng finalPlace, LatLng currenLoc) { 
    try { 
     int padding = 200; // Space (in px) between bounding box edges and view edges (applied to all four sides of the bounding box) 
     LatLngBounds.Builder bc = new LatLngBounds.Builder(); 

     bc.include(finalPlace); 
     bc.include(currenLoc); 
     googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bc.build(), padding)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

加载地图后使用此方法。干杯!

+0

他们的文件有点过时了,这终于奏效了! – Starwave

1

最简单的方法是使用CancelableCallback。您应该检查的第一个动作完成,然后调用第二:

mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, size.x, height, 0), new CancelableCallback() { 

       @Override 
       public void onFinish() { 
        CameraUpdate cu_scroll = CameraUpdateFactory.scrollBy(0, 500); 
        mMap.animateCamera(cu_scroll); 
       } 

       @Override 
       public void onCancel() { 
       } 
      }); 
+0

非常感谢。我认为这应该是被接受的答案。您的解决方案很好 – Chandru

0

@ CommonsWare的回答没有实际并不起作用。我发现这是正常工作:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(-33.88,151.21), 15)); 
1

1.在布局中添加xml代码以显示地图。

2.启用Google Maps API,然后获取下面的API关键位置。

<fragment 
        android:id="@+id/map" 
       android:name="com.google.android.gms.maps.MapFragment" 
        android:layout_width="match_parent" 
        android:value="ADD-API-KEY" 
        android:layout_height="250dp" 
        tools:layout="@layout/newmaplayout" /> 
     <ImageView 
      android:id="@+id/transparent_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:src="@color/transparent" /> 

3.将此代码添加到oncreate中。

MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
    mapFragment.getMapAsync(UpadateProfile.this); 

4.在创建后添加此代码。然后放置在

@Override 
public void onMapReady(GoogleMap rmap) { 
    DO WHATEVER YOU WANT WITH GOOGLEMAP 
    map = rmap; 
    setUpMap(); 
} 
public void setUpMap() { 
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
    map.setMyLocationEnabled(true); 
    map.setTrafficEnabled(true); 
    map.setIndoorEnabled(true); 
    map.getCameraPosition(); 
    map.setBuildingsEnabled(true); 
    map.getUiSettings().setZoomControlsEnabled(true); 
    markerOptions = new MarkerOptions(); 
    markerOptions.title("Outlet Location"); 
    map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
     @Override 
     public void onMapClick(LatLng point) { 
      map.clear(); 
      markerOptions.position(point); 
      map.animateCamera(CameraUpdateFactory.newLatLng(point)); 
      map.addMarker(markerOptions); 
      String all_vals = String.valueOf(point); 
      String[] separated = all_vals.split(":"); 
      String latlng[] = separated[1].split(","); 
      MyLat = Double.parseDouble(latlng[0].trim().substring(1)); 
      MyLong = Double.parseDouble(latlng[1].substring(0,latlng[1].length()-1)); 
      markerOptions.title("Outlet Location"); 
      getLocation(MyLat,MyLong); 
     } 
    }); 
} 
public void getLocation(double lat, double lng) { 
    Geocoder geocoder = new Geocoder(UpadateProfile.this, Locale.getDefault()); 
    try { 
     List<Address> addresses = geocoder.getFromLocation(lat, lng, 1); 
    } catch (IOException e) { 
     TODO Auto-generated catch block 
     e.printStackTrace(); 
     Toast.makeText(this,e.getMessage(),Toast.LENGTH_SHORT).show(); 
    } 
} 
@Override 
public void onLocationChanged(Location location) { 
} 
@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
} 
@Override 
public void onProviderEnabled(String provider) { 
} 
@Override 
public void onProviderDisabled(String provider) { 
} 
0

标记 访问当前位置,则无法动画两件事情(如放大和去我的位置)在一个谷歌地图。
因此,使用移动和相机动画缩放

googleMapVar.moveCamera(CameraUpdateFactory.newLatLng(LocLtdLgdVar)); 
googleMapVar.animateCamera(CameraUpdateFactory.zoomTo(10));