2013-10-13 20 views
23

như một câu hỏi đầu tiên sẽ là lạ nhưng hãy để tôi giải thích ... Giả sử rằng chúng tôi có một điểm đánh dấu ở giữa trên bản đồ, khi chúng tôi di chuyển bản đồ bằng ngón tay của mình, chúng tôi có thể thấy điểm đánh dấu đó sẽ không còn hiển thị khi bạn ra khỏi giới hạn của khu vực. Vậy làm thế nào chúng ta có thể tạo ra một điểm đánh dấu luôn ở trung tâm của bản đồ mặc dù chúng ta di chuyển bản đồ ở bất cứ đâu? Có một ứng dụng có tên UBER và họ cung cấp tính năng này, bạn không kéo và thả điểm đánh dấu bạn chỉ di chuyển bản đồ và điểm đánh dấu vẫn là vị trí của nó.Làm cách nào để di chuyển bản đồ bên dưới điểm đánh dấu?

đây là một ảnh chụp màn hình ! [Uber Map Marker] [1]

Như bạn có thể nhìn thấy điểm đánh dấu màu xanh lá cây là trung tâm của màn hình khi chúng tôi di chuyển bản đồ nó vẫn vị trí của nó nhưng cho thấy vị trí mới khi người dùng ngừng di chuyển bản đồ. Làm thế nào chúng ta có thể làm như thế này?

Tôi có mã hiển thị địa chỉ khi bạn kéo & thả điểm đánh dấu, cách hiển thị lại địa chỉ nhưng lần này không phải bằng cách kéo, di chuyển bản đồ? Hy vọng bạn có thể hiểu bất kỳ ý tưởng sẽ là tuyệt vời.

public class MainActivity extends AbstractMapActivity implements 
    OnNavigationListener, OnInfoWindowClickListener, 
    OnMarkerDragListener { 
    private static final String STATE_NAV="nav"; 
    private static final int[] MAP_TYPE_NAMES= { R.string.normal, 
    R.string.hybrid, R.string.satellite, R.string.terrain }; 
    private static final int[] MAP_TYPES= { GoogleMap.MAP_TYPE_NORMAL, 
    GoogleMap.MAP_TYPE_HYBRID, GoogleMap.MAP_TYPE_SATELLITE, 
    GoogleMap.MAP_TYPE_TERRAIN }; 
private GoogleMap map=null; 
String filterAddress = ""; 
Marker marker; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (readyToGo()) { 
     setContentView(R.layout.activity_main); 

     SupportMapFragment mapFrag= 
      (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 

     mapFrag.setRetainInstance(true); 
     initListNav(); 

     map=mapFrag.getMap(); 

     if (savedInstanceState == null) { 
      CameraUpdate center= 
       CameraUpdateFactory.newLatLng(new LatLng(
         41.003739, 
         28.999572)); 
      CameraUpdate zoom=CameraUpdateFactory.zoomTo(10); 

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

      addMarker(map, 41.003739, 28.999572, R.string.un, R.string.united_nations); 

       map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater())); 
       map.setOnInfoWindowClickListener(this); 
       map.setOnMarkerDragListener(this); 
     } 
    } 
} 

@Override 
public boolean onNavigationItemSelected(int itemPosition, long itemId) { 
    map.setMapType(MAP_TYPES[itemPosition]); 

    return(true); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 

    savedInstanceState.putInt(STATE_NAV, 
      getSupportActionBar().getSelectedNavigationIndex()); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt(STATE_NAV)); 
} 

@Override 
public void onInfoWindowClick(Marker marker) { 
    Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onMarkerDragStart(Marker marker) { 
    LatLng position=marker.getPosition(); 

    Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f", 
      position.latitude, 
      position.longitude)); 
} 

@Override 
public void onMarkerDrag(Marker marker) { 
    LatLng position=marker.getPosition(); 

    Log.d(getClass().getSimpleName(), 
      String.format("Dragging to %f:%f", position.latitude, 
        position.longitude)); 
} 

@Override 
public void onMarkerDragEnd(Marker marker) { 
    LatLng position=marker.getPosition(); 

    String filterAddress = ""; 
    Geocoder geoCoder = new Geocoder(
      getBaseContext(), Locale.getDefault()); 
    try { 
     List<Address> addresses = geoCoder.getFromLocation(
       position.latitude, 
       position.longitude, 1); 

     if (addresses.size() > 0) { 
      for (int index = 0; 
      index < addresses.get(0).getMaxAddressLineIndex(); index++) 
       filterAddress += addresses.get(0).getAddressLine(index) + " "; 
     } 
    }catch (IOException ex) {   
     ex.printStackTrace(); 
    }catch (Exception e2) { 
     // TODO: handle exception 
     e2.printStackTrace(); 
    } 
    Log.d(getClass().getSimpleName(), 
      String.format("Dragging to %f:%f", position.latitude, 
        position.longitude)); 
    TextView myTextView = (TextView) findViewById(R.id.test); 

    myTextView.setText("Address is: " + filterAddress); 

} 

private void initListNav() { 
    ArrayList<String> items=new ArrayList<String>(); 
    ArrayAdapter<String> nav=null; 
    ActionBar bar=getSupportActionBar(); 

    for (int type : MAP_TYPE_NAMES) { 
     items.add(getString(type)); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     nav= 
      new ArrayAdapter<String>(
        bar.getThemedContext(), 
        android.R.layout.simple_spinner_item, 
        items); 
    } 
    else { 
     nav= 
      new ArrayAdapter<String>(
        this, 
        android.R.layout.simple_spinner_item, 
        items); 
    } 

    nav.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
    bar.setListNavigationCallbacks(nav, this); 
} 

private void addMarker(GoogleMap map, double lat, double lon, 
     int title, int snippet) 

{ 
    map.addMarker(new MarkerOptions().position(new LatLng(lat, lon)) 
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.pin)) 

      .draggable(true)); 
} 
    } 

Đây là xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/layout1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_below="@+id/img_header" > 

<fragment 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 

<TextView 
    android:id="@+id/test" 
    android:layout_width="match_parent" 
    android:layout_height="90dp" 
    android:layout_alignParentRight="true" 
    android:text="Address : " 
    android:textColor="#FF0000" 
    android:textSize="22sp" /> 
</RelativeLayout> 
+0

Kiểm tra liên kết này. !! http://stackoverflow.com/questions/13728041/move-markers-in-google-map-v2-android –

+0

đây không phải là những gì tôi yêu cầu .. – regeme

+0

@regeme bạn đã tìm ra giải pháp chưa? Tôi có cùng một vấn đề. bạn có thể đặt câu trả lời không? Cảm ơn!! – Shvet

Trả lời

8

tôi đã không thể có được hiệu quả ứng dụng Uber, tuy nhiên tôi đã có thể làm điều gì đó tương tự, có lẽ nó sẽ làm tốt cho giải pháp của bạn cách sử dụng số GoogleMap.OnCameraChangeListener.

Hoạt động:

public class MyActivity extends Activity implements OnCameraChangeListener { 

    ... 

    @Override 
    public void onCameraChange(CameraPosition position) { 
     mMap.clear(); 
     mMap.addMarker(new MarkerOptions() 
      .position(position.target) 
      .title(position.toString()) 
     ); 
    } 

    ... 

} 

Vấn đề là, các điểm đánh dấu không được rút ra trong khi máy ảnh đang được di chuyển. Tuy nhiên, có vẻ như bạn đã tạo một lớp phủ của một điểm đánh dấu. Vì vậy, với một lớp phủ, nó sẽ hoạt động giống như ứng dụng Uber.

Tôi hy vọng điều này sẽ giúp, ngay cả câu hỏi là một vài tháng tuổi, có lẽ nó sẽ mang lại lợi ích cho các nhà phát triển trong tương lai.

Kind coi Miki

1

Kiểm tra this câu trả lời

đầu tiên: thêm một ImageView để cùng bố cục và vị trí tương đương với trung tâm.thứ hai: để có được tọa độ của trung tâm của bản đồ sử dụng phương pháp sau đây

1_ get viewgroup (FrameLayout) in my case where the map fragment is located. 

- FrameLayout myContainer = (FrameLayout) findViewById(R.id.content_frame); 
    int mapHeight = myContainer.getHeight(); 
    int mapWidth = myContainer.getWidth(); 
2_ use setOnCameraChangeListener and on camera change get the coordinates: 

LatLng center = mMap.getCameraPosition().target; 

Và cũng here là giải pháp hoàn chỉnh của tôi

20

Hai bước đơn giản:

Bước 1

tôi đã sử dụng một RelativeLayout làm phụ huynh của đoạn với bản đồ và trung tâm trong đó một ImageView (sẽ làm điểm đánh dấu bản đồ trung tâm giống như trong ứng dụng taxi uber hoặc dễ dàng):

<!-- Map and ImageView in center for simulating the map marker --> 
<RelativeLayout 
    android:id="@+id/confirm_address_map_wrapper" 
    android:layout_width="match_parent" 
    android:layout_height="220dp"> 

    <fragment 
     android:id="@+id/confirm_address_map_fragment" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerInParent="true" 
     /> 
    <!-- Image View that acts as map marker notice centerInParent--> 
    <ImageView 
     android:id="@+id/confirm_address_map_custom_marker" 
     android:layout_width="@dimen/ICON_DEFAULT_SIZE" 
     android:layout_height="@dimen/ICON_DEFAULT_SIZE" 
     android:layout_centerInParent="true" 
     android:src="@mipmap/my_map_marker"/> 
</RelativeLayout> 

Bước 2

phương pháp

onMapReady() tại hoạt động của tôi, tôi sử dụng googlemap phương pháp dụ setOnCameraChangeListener() cho phép tôi nghe khi bản đồ được sử dụng và có được độ và vĩ độ dựa trên trung tâm của vị trí camera:

@Override 
    public void onMapReady(GoogleMap googleMap) { 

     googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
     @Override 
     public void onCameraChange(CameraPosition cameraPosition) { 

      Log.i("centerLat",cameraPosition.target.latitude); 

      Log.i("centerLong",cameraPosition.target.longitude); 
     } 
    }); 

} 

CẬP NHẬT:
OnCameraChangeListener không được dùng nữa. Vui lòng sử dụng OnCameraIdleListener:
[Nguồn: https://stackoverflow.com/a/38732283/421467]

+0

Thao tác này sẽ đưa hình ảnh vào giữa màn hình để chặn biểu tượng vị trí của tôi (biểu tượng màu xanh lam). Tôi muốn đặt hình ảnh lên trên biểu tượng màu xanh dương (như trong Uber). –

+0

có và Ngoại lệ khi tôi muốn nhận vĩ độ và kinh độ ..... tại java.util.ArrayList.throwIndexOutOfBoundsException –

+1

Bạn có thể đặt Chế độ xem ở giữa bản đồ và đặt ImageView phía trên Chế độ xem này. –

2

Nếu bạn đang sử dụng Fragment để hiển thị bản đồ google của bạn, đặt ImageView bên trong Fragment để che phủ đánh dấu tùy chỉnh của bạn mà đánh dấu của bạn vẫn cố định khi bạn đang di chuyển bản đồ của bạn. Thực hiện theo các mã cho tập tin xml:

<fragment 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.MapFragment" > 

    <ImageView 
     android:id="@+id/pin" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:contentDescription="@null" 
     android:src="@drawable/pin" /> 
</fragment> 

Trong việc sử dụng tập tin activity.java này:

ImageView pinButton = (ImageView) findViewById(R.id.pin); 

sử dụng setOnCameraChangeListener() để có được độ và vĩ độ dựa trên trung tâm của vị trí camera hoặc làm theo các câu trả lời được cung cấp bởi @androidPlusPlus

Các vấn đề liên quan