OSMdroid自定义和旋转当前位置的图标

时间:2016-02-27 18:55:33

标签: android gps osmdroid currentlocation bearing

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

1)首选 - 我想将显示当前位置的默认图标更改为自定义图标。另外我需要它根据GPS返回的轴承改变它的旋转让我们说每5秒钟。图标的位置应位于屏幕的中心。

OR

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

有没有办法在osmdroid中做到这一点?

感谢。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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);
    }
}