如果你熟悉实现自定义视图 https://developer.android.com/training/custom-views/index.html,您可以创建扩展的自定义视图MapView https://developers.google.com/android/reference/com/google/android/gms/maps/MapView用于完全控制视图画布上的绘图的类。但是因为MapView
延伸FrameLayout
这是ViewGroup
,你应该覆盖dispatchDraw() https://developer.android.com/reference/android/view/ViewGroup.html#dispatchDraw(android.graphics.Canvas)方法,不onDraw()
并在其中实现雷达绘图。像这样的东西:
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
canvas.save();
drawRadarOverTheMap(canvas);
canvas.restore();
}
你需要通过调用它invalidate()
在每张地图上移动/缩放/旋转。为了检测地图移动/缩放/旋转,您需要GoogleMap https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap(确切地GoogleMap.setOnCameraMoveListener() https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.html#setOnCameraMoveListener(com.google.android.gms.maps.GoogleMap.OnCameraMoveListener)方法)。您可以声明GoogleMap
自定义 MapView 类中的对象并通过 setter 设置它,但如果自定义 MapView 类将实现更好OnMapReadyCallback https://developers.google.com/android/reference/com/google/android/gms/maps/OnMapReadyCallback界面并获取它onMapReady()
打回来。
完整源代码MapView
基于自定义视图(例如RadarMapView
)可以是这样的:
public class RadarMapView extends MapView implements OnMapReadyCallback {
private OnMapReadyCallback mMapReadyCallback;
private GoogleMap mGoogleMap;
private Marker mMarker;
private Paint mPaintRadar;
public RadarMapView(@NonNull Context context) {
super(context);
init();
}
public RadarMapView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public RadarMapView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public RadarMapView(@NonNull Context context, @Nullable GoogleMapOptions options) {
super(context, options);
init();
}
@Override
public void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
canvas.save();
drawRadarOverTheMap(canvas);
canvas.restore();
}
private void drawRadarOverTheMap(Canvas canvas) {
if (mGoogleMap == null) {
return;
}
final float centerX = getX() + getWidth() / 2;
final float centerY = getY() + getHeight() / 2;
canvas.drawCircle(centerX, centerY, 150, mPaintRadar);
canvas.drawCircle(centerX, centerY, 300, mPaintRadar);
canvas.drawCircle(centerX, centerY, 450, mPaintRadar);
}
private void init() {
setWillNotDraw(false);
mPaintRadar = new Paint();
mPaintRadar.setColor(Color.GREEN);
mPaintRadar.setStyle(Paint.Style.STROKE);
mPaintRadar.setStrokeWidth(10);
}
@Override
public void getMapAsync(OnMapReadyCallback callback) {
mMapReadyCallback = callback;
super.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
mGoogleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
@Override
public void onCameraMove() {
invalidate();
}
});
if (mMapReadyCallback != null) {
mMapReadyCallback.onMapReady(googleMap);
}
}
}
你可以用它.xml
file:
<?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_name}.MainActivity">
<{your_package_name}.RadarMapView
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</RelativeLayout>
for MainActivity
like:
public class MainActivity extends AppCompatActivity {
private static final String MAP_VIEW_BUNDLE_KEY = "MapViewBundleKey";
private GoogleMap mGoogleMap;
private RadarMapView mMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bundle mapViewBundle = null;
if (savedInstanceState != null) {
mapViewBundle = savedInstanceState.getBundle(MAP_VIEW_BUNDLE_KEY);
}
mMapView = (RadarMapView) findViewById(R.id.mapview);
mMapView.onCreate(mapViewBundle);
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Bundle mapViewBundle = outState.getBundle(MAP_VIEW_BUNDLE_KEY);
if (mapViewBundle == null) {
mapViewBundle = new Bundle();
outState.putBundle(MAP_VIEW_BUNDLE_KEY, mapViewBundle);
}
mMapView.onSaveInstanceState(mapViewBundle);
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onStart() {
super.onStart();
mMapView.onStart();
}
@Override
protected void onStop() {
super.onStop();
mMapView.onStop();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mMapView.onDestroy();
super.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
}
你应该得到类似的东西:
您还可以通过以下方式在自定义视图画布上绘制位图雷达图像canvas.drawBitmap() https://developer.android.com/reference/android/graphics/Canvas#drawbitmap method.
而且你还可以放置ImageView
over MapView
or MapFragment
(例如在RelativeLayout
)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/radar"
/>
</RelativeLayout>
并绘制(甚至只是设置)雷达图像ImageView
.