Azl*_*mal 6 android google-maps
我设法启动并运行了谷歌地图。问题是我正在开发的应用程序的当前设计与谷歌地图中的缩放控件重叠。如何将此缩放控件移动到另一个位置?
我找到了 2 种移动 GoogleMap 缩放控件的方法。第一个在@Numan1617 的回答中提到,使用setPadding()函数:
googleMap.setPadding(left, top, right, bottom);
Run Code Online (Sandbox Code Playgroud)
当屏幕底部有 Google AdView横幅时,这对于确保缩放控件可见非常有用。像这样:
googleMap.setPadding(0,0,0,adViewLayout.getHeight());
Run Code Online (Sandbox Code Playgroud)
这会将左下方的 Google 名称、缩放控件和工具栏(当您触摸地图上的标记时从右向左滑动)移动到包含您的 AdView 的布局的正上方。否则,这些 UI 控件可能完全或部分位于AdView后面。
但是如果你想要比这更精细的控制呢?喜欢将缩放控件一直移动到角落?所以我深入研究并找到了这样做的方法:获取包含缩放控件的视图对象并为其设置新的 LayoutParams。
我还想移动指南针和工具栏,所以我也在这里包含了代码。
注意:GoogleMap UI 控件设置了文本标签,可以方便地访问它们。我包含了我能找到的所有 UI 控件文本标签。
包围布局的缩放控件上似乎没有方便的标记,因此我必须获取其中一个放大/缩小控件,然后获取它的父视图(实际上是 ViewGroup)。我发现它包含RelativeLayout.LayoutParams,这意味着它的封闭布局是一个RelativeLayout。
这是在DisplayMapFragment.java:
package <blah>;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
public class DisplayMapFragment implements OnMapReadyCallback {
private static final String TAG = DisplayMapFragment.class.getSimpleName();
private static final String GOOGLEMAP_COMPASS = "GoogleMapCompass"; // [4]
private static final String GOOGLEMAP_TOOLBAR = "GoogleMapToolbar"; // [3]
private static final String GOOGLEMAP_ZOOMIN_BUTTON = "GoogleMapZoomInButton"; // [2]child[0]
private static final String GOOGLEMAP_ZOOMOUT_BUTTON = "GoogleMapZoomOutButton"; // [2]child[1]
private static final String GOOGLEMAP_MYLOCATION_BUTTON = "GoogleMapMyLocationButton";// [0]
private View mapView = null;
public DisplayMapFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_map, container, false);
Log.d(TAG, "onCreateView()");
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.setRetainInstance(true);
mapFragment.getMapAsync(this); // map calls my onMapReady()
mapView = mapFragment.getView();
return view;
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.d(TAG, "onMapReady()");
// move the compass to top center
moveCompass(mapView,-1,4,-1,-1,true,false);
// move toolbar to right center
moveToolbar(mapView,-1,-1,4,-1,false,true);
// move zoom controls to bottom right
moveZoomControls(mapView, -1,-1,4,4,false,false);
}
/**
* Move the View according to the passed params. A -1 means to skip that one.
*
* NOTE: this expects the view to be inside a RelativeLayout.
*
* @param view - a valid view
* @param left - the distance from the left side
* @param top - the distance from the top
* @param right - the distance from the right side
* @param bottom - the distance from the bottom
* @param horizontal - boolean, center horizontally if true
* @param vertical - boolean, center vertically if true
*/
private void moveView(View view, int left, int top, int right, int bottom, boolean horizontal, boolean vertical) {
try {
assert view != null;
// replace existing layout params
RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
if (left >= 0) {
rlp.addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
rlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
}
if (top >= 0) {
rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
}
if (right >= 0) {
rlp.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
rlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
}
if (bottom >= 0) {
rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
}
if (horizontal) {
rlp.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
}
if (vertical) {
rlp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
}
rlp.setMargins(left, top, right, bottom);
view.setLayoutParams(rlp);
} catch (Exception ex) {
Log.e(TAG, "moveView() - failed: " + ex.getLocalizedMessage());
ex.printStackTrace();
}
}
private void moveCompass(View mapView, int left, int top, int right, int bottom, boolean horizontal, boolean vertical) {
assert mapView != null;
View compass = mapView.findViewWithTag(GOOGLEMAP_COMPASS);
if (compass != null) {
moveView(compass,left,top,right,bottom,horizontal,vertical);
}
}
private void moveToolbar(View mapView, int left, int top, int right, int bottom, boolean horizontal, boolean vertical) {
assert mapView != null;
View toolbar = mapView.findViewWithTag(GOOGLEMAP_TOOLBAR);
if (toolbar != null) {
moveView(toolbar,left,top,right,bottom,horizontal,vertical);
}
}
private void moveZoomControls(View mapView, int left, int top, int right, int bottom, boolean horizontal, boolean vertical) {
assert mapView != null;
View zoomIn = mapView.findViewWithTag(GOOGLEMAP_ZOOMIN_BUTTON);
// we need the parent view of the zoomin/zoomout buttons - it didn't have a tag
// so we must get the parent reference of one of the zoom buttons
View zoomInOut = (View) zoomIn.getParent();
if (zoomInOut != null) {
moveView(zoomInOut,left,top,right,bottom,horizontal,vertical);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5775 次 |
| 最近记录: |