使用IconFactory的setContentRotation调整内容对齐,实现Uber式标记旁信息展示
Hey there! I get what you're trying to do—building those Uber-like marker info displays that stay visible on multiple markers at once (since InfoWindows can only show one at a time, right?). Let's break down how to tweak content alignment using setContentRotation and other related settings.
First, a quick clarification: setContentRotation itself is designed to rotate the content view inside the IconFactory-generated icon (usually to counteract the icon's own rotation so your text stays upright). To get proper alignment, you'll need to combine this with your custom content view's layout settings. Here's how to do it step by step:
1. Start with a Well-Configured Custom Layout
Your content alignment starts with the XML layout of the view you pass to setContentView(). Make sure you set the correct android:gravity on the root layout to control where your content sits within the view.
For example, if you want centered text with some padding, create a layout like this (res/layout/marker_content.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" <!-- Adjust this to left/right/top/bottom as needed --> android:orientation="vertical" android:padding="8dp"> <TextView android:id="@+id/marker_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Your Marker Info" android:textColor="#FFFFFF" android:textSize="14sp"/> </LinearLayout>
2. Coordinate Icon Rotation and Content Rotation
You're already using setRotation(90) on the IconFactory and setContentRotation(-90) to keep your content upright. Remember: the content rotation is relative to the icon's rotated coordinate system. So when you rotate the icon 90 degrees clockwise, the content's "left" becomes the icon's "top"—this means your layout's gravity settings will map differently to the map's actual directions.
For example:
- If you want content to appear on the right side of the marker (relative to the map), set your layout's
android:gravity="bottom"(since the icon's bottom is the map's right after a 90-degree clockwise rotation). - If you want content to sit above the marker, set
android:gravity="left".
3. Fine-Tune with Padding/Margin
If the layout gravity alone isn't getting the alignment perfect, add padding or margin to your custom view in code to nudge the content into place:
val customView = LayoutInflater.from(this).inflate(R.layout.marker_content, null) // Nudge content to the right by adding left padding customView.setPadding(16, 0, 0, 0) iconFactory.setContentView(customView)
Full Working Example
Putting it all together, here's how your code might look:
// Load your custom content view val customView = LayoutInflater.from(this).inflate(R.layout.marker_content, null) val markerText = customView.findViewById<TextView>(R.id.marker_text) markerText.text = "Pickup Location" // Configure IconFactory val iconFactory = IconGenerator(this) iconFactory.setBackground(resources.getDrawable(R.drawable.background_iconfactory)) iconFactory.setRotation(90) // Rotate the entire icon 90 degrees clockwise iconFactory.setContentRotation(-90) // Rotate content back to upright // Adjust layout gravity for alignment (match your desired position) customView.gravity = Gravity.BOTTOM iconFactory.setContentView(customView) // Add the marker to the map val mMarkerA = mMap?.addMarker(MarkerOptions() .position(LatLng(37.7749, -122.4194)) // Example coordinates .icon(BitmapDescriptorFactory.fromBitmap(iconFactory.makeIcon())))
Key Takeaway
setContentRotation is mainly for keeping your content readable after rotating the icon itself. The actual alignment work happens in your custom view's layout (via gravity) and minor tweaks with padding/margin. Play around with the gravity values relative to your icon's rotation, and you'll get that Uber-style marker info aligned exactly how you want it.
内容的提问来源于stack exchange,提问作者venimania

