2013-02-14 12 views
6

Khi tôi nhấp vào một điểm đánh dấu, xuất hiện một quả bóng. Nhưng có quá không gian giữa điểm đánh dấu và quả bóng, vậy làm thế nào tôi có thể giảm khoảng cách này ?. Nó giống như sử dụng phương pháp setBalloonBottomOffset trong V1 Google Map.Làm thế nào để bù đắp chế độ xem bóng trong một điểm đánh dấu trong Google Map V2?

My custom balloon là lớp này:

public class CustomInfoWindowAdapter implements InfoWindowAdapter { 

    private final View mWindow; 
    private final View mContents; 

    public CustomInfoWindowAdapter(Activity activity) { 
     LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     mWindow = inflater.inflate(R.layout.ballon, null); 
     mContents = inflater.inflate(R.layout.ballon, null); 
    } 

    @Override 
    public View getInfoWindow(Marker marker) { 
     render(marker, mWindow); 
     return mWindow; 
    } 

    @Override 
    public View getInfoContents(Marker marker) { 
     render(marker, mContents); 
     return mContents; 
    } 

    private void render(Marker marker, View view) { 
     String title = marker.getTitle(); 
     TextView titleUi = ((TextView) view.findViewById(R.id.txtTitle)); 
     if (title != null) { 
      titleUi.setText(title); 
     } else { 
      titleUi.setText(""); 
     } 

     String snippet = marker.getSnippet(); 
     TextView snippetUi = ((TextView) view.findViewById(R.id.txtPlace)); 
     if (snippet != null) { 
      snippetUi.setText(snippet); 
     } else { 
      snippetUi.setText(""); 
     } 
    } 
} 

tôi thấy một dấu hiệu như

marker.showInfoWindow(); 

bóng xml của tôi là

<RelativeLayout 
    android:layout_width="250dp" 
    android:layout_height="75dp" 
    android:background="@drawable/ballon" > 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <LinearLayout 
      android:id="@+id/linearLayout1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:orientation="vertical" > 

      <TextView 
       android:id="@+id/txtTitle" 
       style="@style/Ballon_Title" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:ellipsize="end" 
       android:paddingLeft="15dp" 
       android:paddingRight="50dp" 
       android:paddingTop="10dp" 
       android:singleLine="true" 
       android:text="Con mis amigos amigos" /> 

      <TextView 
       android:id="@+id/txtPlace" 
       style="@style/Ballon_Place" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:ellipsize="end" 
       android:paddingBottom="20dp" 
       android:paddingLeft="15dp" 
       android:paddingRight="50dp" 
       android:singleLine="true" 
       android:text="Puerta del sol" /> 
     </LinearLayout> 
    </RelativeLayout> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 
    </RelativeLayout> 

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:paddingRight="12dp" 
     android:paddingTop="18dp" 
     android:src="@drawable/icon_arrow" /> 
</RelativeLayout> 

+0

Bạn có thể thêm ảnh chụp màn hình để chúng tôi có thể thấy lỗi không? Tôi sẽ khuyên bạn 1 - return null; 'bên trong' getInfoContents' 2-thổi phồng khung nhìn bên trong 'getInfoWindow'. Không sử dụng lại. –

+0

Nó không có bất kỳ lỗi nào. Vấn đề chính là khoảng cách giữa điểm đánh dấu và bong bóng, khi tôi có nhiều bài thơ, người dùng không biết poi nào đã nhấp vào. Vì vậy, nếu nó rất khó để sửa chữa nó, tốt nhất để rời khỏi nó. – beni

Trả lời

0

Bạn đã thử sử dụng lề dưới tiêu cực cho bố cục toàn bộ bóng của mình chưa? Giống như vậy:

<RelativeLayout 
    android:layout_width="250dp" 
    android:layout_height="75dp" 
    android:background="@drawable/ballon" 

    android:layout_marginBottom="-8dp" > 

Có thể sẽ không hoạt động hoặc khiến nội dung bị cắt ở phía dưới, nhưng vẫn đáng để thử làm phương pháp đơn giản nhất. Có lẽ có một cách khác để đánh lừa lớp học GoogleMap nhưng thật khó để tìm ra không có mã nguồn cho API.

Mẹo khác: có thể bạn không cần phương thức getInfoContents() - chỉ cần trả lại null tại đó. Phương thức này sẽ chỉ được gọi nếu bạn trả lại null từ getInfoWindow() (see here) - để kết hợp chế độ xem nội dung của bạn vào cửa sổ thông tin mặc định, rõ ràng không phải là mục tiêu của bạn vì bạn muốn di chuyển quả bóng xung quanh. Do đó, bạn cũng có thể ném ra mContents, nó hoàn toàn dư thừa, chỉ cần ghi nhớ một bản sao của hệ thống phân cấp lượt xem tăng cao của bạn mà không bao giờ được sử dụng.

Hãy cho tôi biết điều khoản lợi nhuận có phù hợp với bạn hay không. Chúng tôi có lẽ cũng có thể cố gắng sử dụng một cái gì đó như ((View)mWindow.getParent()) sau này khi mặt hàng đang được hiển thị nhưng điều đó sẽ phức tạp hơn vì vậy tôi sugget chỉ cần thử margin đầu tiên.

+0

Vâng, tôi đã thử nó. Nhưng khoảng cách giữa quả bóng và dấu ấn không thay đổi. Nó làm cho bố trí, được chứa trong bóng, được dời xuống dưới. Và nó không phải là rất tốt đẹp, bởi vì các mũi tên bóng biến mất trong bố trí. – beni

+0

Ok, di chuyển tiếp theo. Trước khi trở về từ 'getInfoWindow()', hãy đăng một cái gì đó giống như 'LayoutParams parentParams = ((Xem) mWindow.getParent()). GetLayoutParams()' đến ui handler (một trình xử lý mới() 'trong' onCreate() 'của một hoạt động đó là một bộ xử lý luồng ui), thiết lập một điểm ngắt trong runnable. Bằng cách này bạn sẽ thấy nếu bạn có thể di chuyển cha mẹ của cửa sổ thông tin. (Đây chỉ là ngoài đỉnh đầu của tôi, nó có thể không hoạt động.Bí quyết với việc đăng lên trình xử lý là để chạy runnable sau khi cửa sổ thông tin đã được thêm vào để xem hệ thống phân cấp) Chúc mừng, hãy biết cách nó đi –

+0

Nó không có bố mẹ, bởi vì khi tôi tăng lượt xem, thứ hai tham số là null. Vì vậy, khi tôi thực thi phương thức getParent trả về null. – beni

2

Đánh dấu bản đồ được 'neo' theo mặc định ở giữa cuối bố cục của bạn (tức là, neo (0,5,1)).

Bạn có thể thay đổi điểm neo bằng cách sử dụng MarkerOptions.anchor khi tạo Marker của mình.

+0

Cách bạn nói khoảng cách mặc định giữa điểm đánh dấu và bóng là mức tối thiểu với phương thức neo, vì vậy tôi không thể giảm khoảng cách này với phương pháp này, và bây giờ, khoảng cách hiện tại giữa chúng lớn một chút. – beni

+0

Neo cho phép bạn đặt điểm đánh dấu ở bất kỳ vị trí nào trong bố cục bóng, từ cột neo (0.0,0.0) ở góc trên bên trái để neo (1.0,1,0) ở góc dưới bên phải. Nếu giá trị mặc định của neo (0,5,1,0) tức là, căn giữa ở phía dưới, không căn chỉnh với đồ họa của bạn, sau đó thay đổi thành neo (0,5,0,9) để di chuyển điểm đánh dấu lên 10% chiều cao của bố cục. – ianhanniballake