如何在地图上添加一个代表80%宽度和80%屏幕高度的矩形,如地图离线区域选择屏幕。我需要得到这个矩形的LatLngBound,这里的LinearLayout可能不是解决方案。
答案 0 :(得分:1)
您可以按getProjection()
方法获取LatLon
像素坐标,并使用onDraw()
custom view方法绘制所需内容。
所以,就像在this的NSimon回答中一样,只需在地图活动布局xml中添加FrameView
所需的透明度的自定义视图(例如MapFragment
):
<fragment
android:id="@+id/map_fragment"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<[your_package].FrameView
android:id="@+id/frame_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
其中[your_package].FrameView
是
public class FrameView extends View {
private Paint mTransparentPaint;
private Paint mBorderPaint;
private Paint mSemiBlackPaint;
private Path mPath = new Path();
private GoogleMap mGoogleMap = null;
private float x1, y1, x2, y2;
public FrameView(Context context) {
super(context);
init();
}
public FrameView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public FrameView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mTransparentPaint = new Paint();
mTransparentPaint.setColor(Color.TRANSPARENT);
mTransparentPaint.setStyle(Paint.Style.FILL);
mBorderPaint = new Paint();
mBorderPaint.setColor(Color.BLUE);
mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setStrokeWidth(10);
mSemiBlackPaint = new Paint();
mSemiBlackPaint.setColor(Color.TRANSPARENT);
mSemiBlackPaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
x1 = 0.1f * canvas.getWidth();
y1 = 0.1f * canvas.getHeight();
x2 = 0.9f * canvas.getWidth();
y2 = 0.8f * canvas.getHeight();
mPath.reset();
mPath.addRect(x1, y1, x2, y2, Path.Direction.CW);
mPath.setFillType(Path.FillType.INVERSE_EVEN_ODD);
canvas.drawRect(x1, y1, x2, y2, mTransparentPaint);
canvas.drawRect(x1, y1, x2, y2, mBorderPaint);
canvas.drawPath(mPath, mSemiBlackPaint);
canvas.clipPath(mPath);
canvas.drawColor(Color.parseColor("#83000000"));
}
public void setMap(GoogleMap googleMap) {
mGoogleMap = googleMap;
}
public LatLng getTopLeft() {
return point2LatLng(new Point((int)x1, (int)y1));
}
public LatLng getTopRight() {
return point2LatLng(new Point((int)x2, (int)y1));
}
public LatLng getBottomLeft() {
return point2LatLng(new Point((int)x1, (int)y2));
}
public LatLng getBottomRight() {
return point2LatLng(new Point((int)x2, (int)y2));
}
public LatLng point2LatLng(Point point) {
if (mGoogleMap != null) {
Projection projection = mGoogleMap.getProjection();
return projection.fromScreenLocation(point);
} else {
return null;
}
}
}
其中x1,x2,y1,y2 - “frame”矩形的坐标,以像素为单位。
您需要在FrameView
中获取onCreate()
对象:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFrameView = (FrameView) findViewById(R.id.frame_view);
mapFragment = (MapFragment) getFragmentManager()
.findFragmentById(R.id.map_fragment);
mapFragment.getMapAsync(this);
...
}
并在GoogleMap
中为mFrameView
设置onMapReady()
个对象:
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
mFrameView.setMap(mGoogleMap);
...
}
现在,您可以在需要时通过LatLon
,mFrameView.getTopLeft()
等来获取mFrameView.getTopRight()
个电话:
NB!这只是自定义组件的快速而肮脏的示例。