【问题标题】:Rotating drawable via XML not working with marker on GoogleMap V2通过 XML 旋转可绘制对象不适用于 GoogleMap V2 上的标记
【发布时间】:2013-07-16 11:17:31
【问题描述】:

我想用一个xml文件旋转一个drawable,然后在地图上显示它。

我喜欢这个。

//...//
mo1.position(myLatLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.myxmldrawable));
map.addMarker(mo1);
//...//

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="180"
        android:toDegrees="180"
        android:pivotX="50%"
        android:pivotY="50%"
        android:drawable="@drawable/pin"/>

如果我运行代码,捕获以下异常:

07-16 13:10:18.347: W/System.err(26084): java.lang.NullPointerException
07-16 13:10:18.347: W/System.err(26084):    at maps.ah.bm.a(Unknown Source)
07-16 13:10:18.347: W/System.err(26084):    at maps.ah.bm.a(Unknown Source)
07-16 13:10:18.347: W/System.err(26084):    at maps.ah.an.a(Unknown Source)
07-16 13:10:18.347: W/System.err(26084):    at bgc.onTransact(SourceFile:167)
07-16 13:10:18.347: W/System.err(26084):    at android.os.Binder.transact(Binder.java:326)
07-16 13:10:18.347: W/System.err(26084):    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
07-16 13:10:18.347: W/System.err(26084):    at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
07-16 13:10:18.347: W/System.err(26084):    at hu.illion.ayt.activities.MapAct$GetBolyakAsync.onPostExecute(MapAct.java:1177)
07-16 13:10:18.347: W/System.err(26084):    at hu.illion.ayt.activities.MapAct$GetBolyakAsync.onPostExecute(MapAct.java:1)
07-16 13:10:18.347: W/System.err(26084):    at android.os.AsyncTask.finish(AsyncTask.java:631)
07-16 13:10:18.347: W/System.err(26084):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
07-16 13:10:18.347: W/System.err(26084):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
07-16 13:10:18.357: W/System.err(26084):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-16 13:10:18.357: W/System.err(26084):    at android.os.Looper.loop(Looper.java:137)
07-16 13:10:18.357: W/System.err(26084):    at android.app.ActivityThread.main(ActivityThread.java:4867)
07-16 13:10:18.357: W/System.err(26084):    at java.lang.reflect.Method.invokeNative(Native Method)
07-16 13:10:18.357: W/System.err(26084):    at java.lang.reflect.Method.invoke(Method.java:511)
07-16 13:10:18.357: W/System.err(26084):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
07-16 13:10:18.357: W/System.err(26084):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
07-16 13:10:18.357: W/System.err(26084):    at dalvik.system.NativeStart.main(Native Method)

excpetion 指向我想在地图上添加标记的行。

重要提示:我已成功使用 .png 可绘制对象。我有 xml 仅定义可绘制的问题(旋转...)

那么这是什么? GoogleMap 无法处理 XML drawable 还是什么?

编辑:

好的,所以在我尝试了这个建议后,发现它不起作用,(仍然有 nullptr 异常)我只是说了我什么都注销了。

结果对我来说很奇怪。

Logcat 结果:

 07-17 22:11:11.410: I/myResource(22971): myResource is: 2130837627
07-17 22:11:11.410: I/myBitmapDescriptor(22971): myBitmapDescriptor is: com.google.android.gms.maps.model.BitmapDescriptor@41b24230
07-17 22:11:11.410: I/myLatLng(22971): myLatLng is OK
07-17 22:11:11.410: I/myMarker(22971): myMarker is OK
07-17 22:11:11.410: I/myMarker(22971): myMarker is still OK
07-17 22:11:11.410: I/map(22971): map is OK

看到了吗?一切都有参考。 None 是 NULL,但 NullPointerException 仍然存在。 代码是:

MarkerOptions myMarker = new MarkerOptions();


                        LatLng myLatLng = new LatLng(Double.valueOf(myHashMap.get("lat2")), Double.valueOf(myHashMap.get("lng2")));

                        if (myHashMap.get("point_type").equals("1")) {

                            Bitmap icon = BitmapFactory.decodeResource(MapAct.this.getResources(), R.drawable.ellenfel);

                            mo1.position(kezdoLatLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.startbolya));
                            myMarker.position(myLatLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.zsuri0));
                        } else {
                            mo1.position(kezdoLatLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.endbolya));

                            int myResource = getResources().getIdentifier("zsuri180","drawable", getPackageName());

                            if(myResource==0)
                            {
                                Log.i("myResource", "myResource is null");
                            }
                            else
                            {
                                Log.i("myResource", "myResource is: "+myResource+"");
                            }

                            BitmapDescriptor myBitmapDescriptor = BitmapDescriptorFactory.fromResource(myResource);

                            if(myBitmapDescriptor==null)
                            {

                                Log.i("myBitmapDescriptor", "myBitmapDescriptor is null");
                            }
                            else
                            {
                                Log.i("myBitmapDescriptor", "myBitmapDescriptor is: "+myBitmapDescriptor);
                            }


                            if(myLatLng==null)
                            {
                                Log.i("myLatLng", "myLatLng is NULL");
                            }
                            else
                            {
                                Log.i("myLatLng", "myLatLng is OK");
                            }

                            myMarker.position(myLatLng);

                            if(myMarker==null)
                            {
                                Log.i("myMarker", "myMarker is NULL");
                            }
                            else
                            {
                                Log.i("myMarker", "myMarker is OK");
                            }


                            myMarker.icon(myBitmapDescriptor);


                            if(myMarker==null)
                            {
                                Log.i("myMarker", "myMarker is NULL");
                            }
                            else
                            {
                                Log.i("myMarker", "myMarker is still OK");
                            }

                            if(map==null)
                            {
                                Log.i("map", "map is NULL");
                            }
                            else
                            {
                                Log.i("map", "map is OK");
                            }


                        }

                        map.addMarker(myMarker);

【问题讨论】:

    标签: android google-maps-android-api-2 google-maps-api-2


    【解决方案1】:

    您不能将非 PNG 资源用作Marker 的图标。

    但是,您可以将此类 Drawable 加载到内存中,使用 Canvas 将其绘制到 Bitmap 中,然后使用 BitmapDescriptorFactory.fromBitmap(...)Bitmap 发送到 MarkerOptions.icon

    【讨论】:

    • 遗憾的是,这是正确的答案。这很可能与 XML 可绘制对象没有内置尺寸有关。
    • @Jarett 更可能的是,Bitmap 必须通过 IPC 发送到 Google Play 服务。
    【解决方案2】:

    好吧,在我看来问题是这样的(正如我所想的那样):

    您在.icon(BitmapDescriptorFactory.fromResource(R.drawable.myxmldrawable) 中遇到问题, 因为 R.drawable 只适用于可绘制文件夹中的文件。

    要获取资源,请使用:

    getResources().getIdentifier(myxmldrawable,"drawable", getPackageName()) 上面使用的 myxmldrawable 为 XML 图标属性分配了变量 使用它来动态获取图标:

    .icon(BitmapDescriptorFactory .fromResource(getResources().getIdentifier(icon,"drawable", getPackageName()))

    你应该这样做。

    干杯:)

    【讨论】:

    • 至少你不应该收到NullPointerException - 对吧?如果是这样,那么请从现在开始粘贴错误。谢谢
    • 只是为了让您知道,我正在扫描此链接 E:stackoverflow.com/questions/4836451/…。希望我能找到解决方案,看起来这是一个常见问题......
    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    相关资源
    最近更新 更多