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

Android OSMdroid当前位置的自定义和旋转图标,android,gps,osmdroid,currentlocation,bearing,Android,Gps,Osmdroid,Currentlocation,Bearing,我正在使用OSMdroid显示用户当前位置的脱机地图 1) 首选-我想将显示当前位置的默认图标更改为自定义图标。我还需要它根据GPS返回的方向改变它的旋转,比如说每5秒。图标的位置应位于屏幕中央 或 2) 可能性-使用屏幕底部固定的自定义当前位置图标旋转地图 在osmdroid中有什么方法可以做到这一点吗 谢谢。1)osmdroid已经支持了一段时间了。有几个“我的位置”类型覆盖图以及如何使用它们的示例。根据您使用的osmdroid版本,替换默认图标的机制略有不同 2) osmdroid有一个支

我正在使用OSMdroid显示用户当前位置的脱机地图

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

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

在osmdroid中有什么方法可以做到这一点吗

谢谢。

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


2) osmdroid有一个支持此功能的请求。我敢肯定,它允许我的位置偏移在屏幕上的任何位置。

似乎我找到了第一种可能性。 我在地图上添加了一个标记,当调用onLocationChanged()时,该标记会更改其位置。地图也会移动,因此标记位于中心。然后我做标记。设置旋转(方向)

需要实现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);
    }
}
@覆盖
位置更改后的公共空间(最终位置pLoc){
长currentTime=System.currentTimeMillis();
if(mIgnorer.shouldIgnore(pLoc.getProvider(),currentTime))
返回;
double dT=当前时间-mLastTime;
如果(dT<100.0){
//Toast.makeText(this,pLoc.getProvider()+“dT=“+dT,Toast.LENGTH_SHORT).show();
返回;
}
mLastTime=当前时间;
地质点新位置=新地质点(pLoc);
如果(!myLocationOverlay.isEnabled()){
//我们第一次得到了位置:
myLocationOverlay.setEnabled(真);
map.getController().animateTo(newLocation);
}
GeoPoint prevLocation=myLocationOverlay.getLocation();
myLocationOverlay.setLocation(新位置);
myLocationOverlay.setAccurance((int)pLoc.getAccurance());
if(prevLocation!=null&&pLoc.getProvider().equals(LocationManager.GPS\u PROVIDER)){
mSpeed=pLoc.getSpeed()*3.6;
long speedInt=数学圆(mSpeed);
TextView speedTxt=findviewbyd(R.id.speed);
speedTxt.setText(speedInt+“km/h”);
//TODO:检查速度是否太小
如果(mSpeed>=0.1){
mAzimuthAngleSpeed=pLoc.getBearing();
我的位置过度倾斜(最大速度);
}
}
if(mTrackingMode){
//使地图视图以当前位置为中心:
map.getController().animateTo(newLocation);
map.setMapOrientation(-mAzimuthAngleSpeed);
}否则{
//只需重新绘制位置覆盖图:
map.invalidate();
}
如果(错误记录跟踪){
recordCurrentLocationInTrack(“我的轨道”、“我的轨道”、新位置);
}
}
@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);
    }
}