将Android Google Maps v2与自定义View或ImageView一起使用

将Android Google Maps v2与自定义View或ImageView一起使用,第1张

概述基本上,我希望能够使用GoogleMapsv2来在地图上绘制雷达图像,效果很好性能,没有闪烁或延迟的位图图像.我目前正在使用Mapsv1来执行此 *** 作,并且效果很好,但是Mapsv2不太适合这样做.您可能会认为GroundOverlay或TileOverlay可能有效,但从我从尝试使用它们的人那里读到的内容来

基本上,我希望能够使用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(正是070​​04方法).您可以在自定义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一起使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1093347.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存