Google Maps 地图的父布局为RelativeLayout,因此自定义按钮与默认 Google Maps 控制按钮(适用于所有屏幕)对齐的最佳方法是将该自定义按钮置于与默认 Google Maps 控制按钮相同的布局中。假设我们使用 Google Maps 地图的活动具有如下布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="<YOUR_PACKAGE>.MainActivity">
<fragment
android:id="@+id/map_fragment"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ImageView
android:id="@+id/custom_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:visibility="gone"
android:src="@drawable/ic_home_target"/>
</RelativeLayout>
自定义按钮视图最好使用ImageView,因为默认按钮布局中有 9 个补丁填充(details here),或者需要为默认的 Google 地图控制按钮设置额外的填充。现在它属于活动布局。所以在onMapReady(GoogleMap googleMap)我们应该:
1) 获取默认谷歌地图控制按钮的父视图;
2) 从根活动布局中移除自定义按钮视图;
3) 将自定义按钮视图添加到默认谷歌地图控制按钮的父视图(在 p.1 中定义);
4) 设置自定义按钮视图相对于默认 Google 地图控件按钮的对齐方式。
使用这样的源代码:
...
private GoogleMap mGoogleMap;
private MapFragment mMapFragment;
private ImageView mCustomButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCustomButton = (ImageView) findViewById(R.id.custom_button);
mMapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map_fragment);
mMapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
// don't forget to allow LOCATION permission
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if (locationPermission == PackageManager.PERMISSION_GRANTED) {
setConrolsPositions();
}
} else {
setConrolsPositions();
}
}
void setConrolsPositions() {
try {
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
// get parent view for default Google Maps control button
final ViewGroup parent = (ViewGroup) mMapFragment.getView().findViewWithTag("GoogleMapMyLocationButton").getParent();
parent.post(new Runnable() {
@Override
public void run() {
try {
// get view for default Google Maps control button
View defaultButton = mMapFragment.getView().findViewWithTag("GoogleMapMyLocationButton");
// remove custom button view from activity root layout
ViewGroup customButtonParent = (ViewGroup) mCustomButton.getParent();
customButtonParent.removeView(mCustomButton);
// add custom button view to Google Maps control button parent
ViewGroup defaultButtonParent = (ViewGroup) defaultButton.getParent();
defaultButtonParent.addView(mCustomButton);
// create layout with same size as default Google Maps control button
RelativeLayout.LayoutParams customButtonLayoutParams = new RelativeLayout.LayoutParams(defaultButton.getHeight(), defaultButton.getHeight());
// align custom button view layout relative to defaultButton
customButtonLayoutParams.addRule(RelativeLayout.ALIGN_LEFT, defaultButton.getId());
customButtonLayoutParams.addRule(RelativeLayout.BELOW, defaultButton.getId());
// add other settings (optional)
mCustomButton.setAlpha(defaultButton.getAlpha());
mCustomButton.setPadding(defaultButton.getPaddingLeft(), defaultButton.defaultButton(),
defaultButton.getPaddingRight(), defaultButton.getPaddingBottom());
// apply layout settings to custom button view
mCustomButton.setLayoutParams(customButtonLayoutParams);
mCustomButton.setVisibility(View.VISIBLE);
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
并在Developer Options 中启用Show layout boundaries 选项,您应该会得到类似的结果:
如您所见,自定义按钮的大小与默认按钮布局完全相同,并位于其下方。
为了获得更好的效果,有必要调整自定义按钮字形(填充、透明度、颜色等)
或者可能是最简单的方法:根本不要使用默认的 Google 地图 "GoogleMapMyLocationButton" 按钮 - 将其 Enabled 属性设置为 false (mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false);),但使用具有相同图标和功能的按钮的自定义布局由 @ 模拟987654323@ 与“目标主页”自定义按钮的布局相同。