是否可以使用osmdroid实现地图的夜间模式?
我的想法是为所有资源添加一些过滤器,但也许有更好的解决方案?
答案 0 :(得分:2)
Osmdroid只显示地图图块。因此,您可以自由切换到最适合您的“夜间模式”的不同地图提供商/风格。例如旧的cloudmade midnight commander
答案 1 :(得分:1)
这篇文章向您展示了如何反转颜色 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);
}
注意:如果您使用过ScaleBarOverlay
,则可能需要更改其颜色以使其在夜间模式下更可见。
为了帮助找到正确的矩阵,我使用了这个方便的工具colormatrix-viewer