Android 使用osmdroid的夜间模式

Android 使用osmdroid的夜间模式,android,openstreetmap,osmdroid,Android,Openstreetmap,Osmdroid,是否可以使用osmdroid实现地图的夜间模式 我的想法是为所有资源添加一些过滤器,但也许有更好的解决方案?Osmdroid只显示地图分幅。因此,您可以自由切换到最适合您夜间模式的不同地图提供商/样式。例如,旧的Osmdroid只显示地图分幅。因此,您可以自由切换到最适合您夜间模式的不同地图提供商/样式。例如,旧的切换贴图分幅提供程序的稍微优雅的解决方案是稍微改变osmdroid,以在绘制所有分幅之前反转其颜色方案。不太难做 这篇文章向你展示了如何反转颜色 这是要修改的类 可能在第170行附近

是否可以使用osmdroid实现地图的夜间模式


我的想法是为所有资源添加一些过滤器,但也许有更好的解决方案?

Osmdroid只显示地图分幅。因此,您可以自由切换到最适合您夜间模式的不同地图提供商/样式。例如,旧的Osmdroid只显示地图分幅。因此,您可以自由切换到最适合您夜间模式的不同地图提供商/样式。例如,旧的

切换贴图分幅提供程序的稍微优雅的解决方案是稍微改变osmdroid,以在绘制所有分幅之前反转其颜色方案。不太难做

这篇文章向你展示了如何反转颜色

这是要修改的类 可能在第170行附近放置一些布尔逻辑来打开和关闭夜间模式,然后使用矩阵来翻转颜色

您的里程数将随此而变化,因为并非所有的瓷砖来源都适合使用此选项。bing或USGS Sat等卫星图像可能会变得更亮。道路/topo/hillshade/mapquest/osm地图可能会变得更暗

编辑:插入更改的更好位置是onTileReadyToShow。
好消息,看起来真的很酷。性能与更改之前大致相同

切换贴图分幅提供程序的更优雅解决方案是稍微更改osmdroid,以在绘制所有分幅之前反转其颜色方案。不太难做

这篇文章向你展示了如何反转颜色

这是要修改的类 可能在第170行附近放置一些布尔逻辑来打开和关闭夜间模式,然后使用矩阵来翻转颜色

您的里程数将随此而变化,因为并非所有的瓷砖来源都适合使用此选项。bing或USGS Sat等卫星图像可能会变得更亮。道路/topo/hillshade/mapquest/osm地图可能会变得更暗

编辑:插入更改的更好位置是onTileReadyToShow。
好消息,看起来真的很酷。性能与5.1版更改前大致相同您可以通过以下方式进行设置:


this.mMapView.getOverlayManager.getTilesOverlay.setColorFilterTitlesOverlay.INVERT_COLORS

从5.1版开始,您可以这样设置:

this.mMapView.getOverlayManager.getTilesOverlay.setColorFilterTitlesOverlay.INVERT_COLORS

TileOverlay.INVERT\u颜色的默认ColorMatrixColorFilter版本不符合我的喜好。因此,我通过在晚上7点之后和早上7点之前更改夜间模式的地图颜色过滤器,制作了自己的自定义版本,并从以下方面获得提示:

注意:如果您使用了ScaleBarroverLay,则可能需要更改其颜色以使其在夜间模式下更可见

为了帮助找到正确的矩阵,我使用这个方便的工具

默认的ColorMatrixColorFilter版本的TileOverlay.INVERT_颜色不符合我的喜好。因此,我通过在晚上7点之后和早上7点之前更改夜间模式的地图颜色过滤器,制作了自己的自定义版本,并从以下方面获得提示:

注意:如果您使用了ScaleBarroverLay,则可能需要更改其颜色以使其在夜间模式下更可见


为了帮助找到正确的矩阵,我使用了这个方便的工具

谢谢,但是如何使用osmdroid更改磁贴的样式?@JMichal通过设置不同的磁贴源(也称为磁贴提供程序)。磁贴提供程序和磁贴源是两件不同的事情。tile源类似于mapquest、bing、usgs等。tile提供程序是,从http加载、从数据库加载、从zip加载,等等。OSM中的@spy这两个术语通常指的是同一事物。然而,osmdroid可能会使用这些术语来指代不同的事物——这似乎是个坏主意,它们不是同一事物。类层次结构是完全不同的,它们不共享一个共同的祖先。在4.3之前,您无法以编程方式更改磁贴提供程序,只能更改磁贴源。我有一个pull请求,使其可配置为对脱机tile用户有用,但如何使用osmdroid更改tile的样式?@JMichal,方法是设置一个不同的tile源,也称为tile provider。tile providers和tile源是两个不同的东西。tile源类似于mapquest、bing、usgs等。tile提供程序是,从http加载、从数据库加载、从zip加载,等等。OSM中的@spy这两个术语通常指的是同一事物。然而,osmdroid可能会使用这些术语来指代不同的事物——这似乎是个坏主意,它们不是同一事物。类层次结构是完全不同的,它们不共享一个共同的祖先。在4.3之前,您无法以编程方式更改磁贴提供程序,只能更改磁贴源。我有一个pull请求,使其可配置为对脱机tile用户有用。我在github上向osmdroid提交了一个票证,并为其提出了pull请求。仅供参考,票证位于待添加,a
ndroid支持夜间变体。这将把资源转移到另一个模式fyi,我在github上向osmdroid提交了一张票据,并请求它。仅供参考,票据位于待添加位置,android支持夜间版本。这将把资源切换到另一种模式
SimpleDateFormat format = new SimpleDateFormat("HH", Locale.getDefault());
String hour = format.format(Tools.getTime());

//night mode after 7 PM and before 7 AM
if (Integer.valueOf(hour) < 7 || Integer.valueOf(hour) > 19) {
    //taking cue from https://medium.com/square-corner-blog/welcome-to-the-color-matrix-64d112e3f43d
    ColorMatrix inverseMatrix = new ColorMatrix(new float[] {
            -1.0f, 0.0f, 0.0f, 0.0f, 255f,
            0.0f, -1.0f, 0.0f, 0.0f, 255f,
            0.0f, 0.0f, -1.0f, 0.0f, 255f,
            0.0f, 0.0f, 0.0f, 1.0f, 0.0f
    });

    int destinationColor = Color.parseColor("#FF2A2A2A");
    float lr = (255.0f - Color.red(destinationColor))/255.0f;
    float lg = (255.0f - Color.green(destinationColor))/255.0f;
    float lb = (255.0f - Color.blue(destinationColor))/255.0f;
    ColorMatrix grayscaleMatrix = new ColorMatrix(new float[] {
            lr, lg, lb, 0, 0, //
            lr, lg, lb, 0, 0, //
            lr, lg, lb, 0, 0, //
            0, 0, 0, 0, 255, //
    });
    grayscaleMatrix.preConcat(inverseMatrix);
    int dr = Color.red(destinationColor);
    int dg = Color.green(destinationColor);
    int db = Color.blue(destinationColor);
    float drf = dr / 255f;
    float dgf = dg / 255f;
    float dbf = db / 255f;
    ColorMatrix tintMatrix = new ColorMatrix(new float[] {
            drf, 0, 0, 0, 0, //
            0, dgf, 0, 0, 0, //
            0, 0, dbf, 0, 0, //
            0, 0, 0, 1, 0, //
    });
    tintMatrix.preConcat(grayscaleMatrix);
    float lDestination = drf * lr + dgf * lg + dbf * lb;
    float scale = 1f - lDestination;
    float translate = 1 - scale * 0.5f;
    ColorMatrix scaleMatrix = new ColorMatrix(new float[] {
            scale, 0, 0, 0, dr * translate, //
            0, scale, 0, 0, dg * translate, //
            0, 0, scale, 0, db * translate, //
            0, 0, 0, 1, 0, //
    });
    scaleMatrix.preConcat(tintMatrix);
    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(scaleMatrix);
    surfaceView.getOverlayManager().getTilesOverlay().setColorFilter(filter);
}