使用osmdroid的夜间模式

时间:2015-07-02 20:25:48

标签: android openstreetmap osmdroid

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

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

4 个答案:

答案 0 :(得分:2)

Osmdroid只显示地图图块。因此,您可以自由切换到最适合您的“夜间模式”的不同地图提供商/风格。例如旧的cloudmade midnight commander

答案 1 :(得分:1)

切换地图图块提供程序的稍微优雅的解决方案是稍微改变osmdroid以在绘制之前反转所有图块的颜色方案。不是很难做到。

这篇文章向您展示了如何反转颜色 Invert colors of drawable Android

这是要修改的课程 https://github.com/osmdroid/osmdroid/blob/master/osmdroid-android/src/main/java/org/osmdroid/views/overlay/TilesOverlay.java 可能在第170行附近将是一个放置一些布尔逻辑来打开和关闭夜间模式的好地方,然后使用矩阵来翻转颜色。

您的里程数会随之变化,因为并非所有瓷砖来源都会看起来很好。卫星图像,如bing或USGS Sat可能会变得更亮。 Road / topo / hillshade / mapquest / osm地图可能会变暗。

编辑:注入更改的更好地方是" onTileReadyToShow"。 好消息,它看起来很酷。绩效与变革前的绩效大致相同

答案 2 :(得分:0)

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

this.mMapView.getOverlayManager().getTilesOverlay().setColorFilter(TilesOverlay.INVERT_COLORS);

答案 3 :(得分:0)

我不喜欢ColorMatrixColorFilter的默认TilesOverlay.INVERT_COLORS版本。因此,我通过更改夜间模式(晚上7点之后和早上7点之前)的地图滤色器来制作自己的自定义版本,并从Medium: Welcome to the (Color) Matrix中得到提示:

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

Sample night mode using a custom ColorMatrixColorFilter with Mapnik

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

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