基本上,我希望能够使用Google Maps v2来
在地图上绘制雷达图像,效果很好
性能,没有闪烁或延迟的位图图像.
我目前正在使用Maps v1来执行此 *** 作,并且效果很好,但是Maps v2
不太适合这样做.
您可能会认为GroundOverlay或TileOverlay可能有效,
但从我从尝试使用它们的人那里读到的内容来看,
您必须先删除()上一张图片,然后再绘制下一张图片,
或做一些尝试将位图图像绘制为标记的 *** 作
或者其他的东西.它必须具有良好的性能.
因此,我希望能够使用自定义视图或ImageVIEw
并使用它的onDraw()绘制位图并使其在地图上可见
并继续前进.
喜欢:
<Outer Container> <fragment .. /> <com.my.customVIEw .. /> or <ImageVIEw .. /></Outer Container>
我在网上到处都在寻找可能的示例
Maps v2如何执行类似 *** 作的详细信息,但已经发现
没有.
我在当前应用程序中使用了几个自定义视图
所以我很熟悉这些,而且我有位图的边界框详细信息
我很确定我可以使用投影信息
帮助画画.
另一个问题是如何调用invalIDate()以便
onDraw()将被调用.
我只需要一些示例代码来展示如何使用onDraw()
从某种基于VIEw的对象中,我可以尝试查看它是否有效,
但是不尝试使用“ GroundOverlay”,“ TileOverlay”或“ Marker”的广告,
我真的很感激!
谢谢!
解决方法:
如果您熟悉implementing custom view,则可以创建自定义视图,该视图扩展了MapView
类,以完全控制视图画布上的绘图.但是由于MapVIEw扩展了作为VIEwGroup的FrameLayout,因此您应该覆盖dispatchDraw()
方法而不是onDraw()并在其中实现雷达绘图.像这样:
@OverrIDepublic voID dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); canvas.save(); drawRadarOverTheMap(canvas); canvas.restore();}
并且您需要在每次地图移动/缩放/旋转时通过invalIDate()调用它.为了检测地图的移动/缩放/旋转,您需要GoogleMap
(正是07004方法).您可以在自定义MapVIEw类中声明GoogleMap对象并通过setter进行设置,但如果自定义MapVIEw类将实现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文件中使用它:
<?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>
对于MainActivity来说:
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()
方法在自定义视图画布上绘制位图Radar图像.
您还可以将ImageVIEw放在MapVIEw或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" /> <ImageVIEw androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_centerInParent="true" androID:src="@drawable/radar" /></relativeLayout>
并在ImageVIEw上绘制(甚至只是设置)雷达图像.
总结以上是内存溢出为你收集整理的将Android Google Maps v2与自定义View或ImageView一起使用全部内容,希望文章能够帮你解决将Android Google Maps v2与自定义View或ImageView一起使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)