【问题标题】:OSMdroid Custom and rotating icon of current locationOSMdroid 自定义和旋转当前位置的图标
【发布时间】:2016-02-27 18:55:33
【问题描述】:

我正在使用 OSMdroid 显示带有用户当前位置的离线地图。

1) 首选 - 我想将显示当前位置的默认图标更改为自定义图标。我还需要它根据 GPS 返回的方位来改变它的旋转,比如说每 5 秒一次。图标的位置应该在屏幕的中心。

2) 可能性 - 使用固定在屏幕底部的自定义当前位置图标旋转地图。

osmdroid 有什么办法吗?

谢谢。

【问题讨论】:

    标签: android gps osmdroid currentlocation bearing


    【解决方案1】:

    1) osmdroid 已经支持了一段时间。有几个我的位置类型覆盖和如何使用它们的示例。根据您使用的 osmdroid 版本,替换默认图标的机制会有所不同。

    2) osmdroid 有一个拉取请求以支持此功能。我很确定它允许我的位置偏移在屏幕上的任何位置。

    【讨论】:

      【解决方案2】:

      似乎我发现了第一种可能性。 我在地图上添加了一个标记,它在调用 onLocationChanged() 时改变了它的位置。地图也会移动,因此标记位于中心。然后我做marker.setRotation(bearing)。

      【讨论】:

        【解决方案3】:
        myLocationOverlay = new DirectedLocationOverlay(this);
        Drawable d = ResourcesCompat.getDrawable(getResources(), R.drawable.direction_arrow, null);
        Bitmap bitmap = ((BitmapDrawable) d).getBitmap();
        myLocationOverlay.setDirectionArrow(bitmap);
        
        //code to change default location icon
        map.getOverlays().add(myLocationOverlay);    
        

        需要实现onLocationChanged方法

        @Override
        public void onLocationChanged(final Location pLoc) {
            long currentTime = System.currentTimeMillis();
            if (mIgnorer.shouldIgnore(pLoc.getProvider(), currentTime))
                return;
            double dT = currentTime - mLastTime;
            if (dT < 100.0) {
                //Toast.makeText(this, pLoc.getProvider()+" dT="+dT, Toast.LENGTH_SHORT).show();
                return;
            }
            mLastTime = currentTime;
        
            GeoPoint newLocation = new GeoPoint(pLoc);
            if (!myLocationOverlay.isEnabled()) {
                //we get the location for the first time:
                myLocationOverlay.setEnabled(true);
                map.getController().animateTo(newLocation);
            }
        
            GeoPoint prevLocation = myLocationOverlay.getLocation();
            myLocationOverlay.setLocation(newLocation);
            myLocationOverlay.setAccuracy((int) pLoc.getAccuracy());
        
            if (prevLocation != null && pLoc.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                mSpeed = pLoc.getSpeed() * 3.6;
                long speedInt = Math.round(mSpeed);
                TextView speedTxt = findViewById(R.id.speed);
                speedTxt.setText(speedInt + " km/h");
        
                //TODO: check if speed is not too small
                if (mSpeed >= 0.1) {
                    mAzimuthAngleSpeed = pLoc.getBearing();
                    myLocationOverlay.setBearing(mAzimuthAngleSpeed);
                }
            }
        
            if (mTrackingMode) {
                //keep the map view centered on current location:
                map.getController().animateTo(newLocation);
                map.setMapOrientation(-mAzimuthAngleSpeed);
            } else {
                //just redraw the location overlay:
                map.invalidate();
            }
        
            if (mIsRecordingTrack) {
                recordCurrentLocationInTrack("my_track", "My Track", newLocation);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-13
          • 1970-01-01
          相关资源
          最近更新 更多