Add support for layer groups, closes #103

This commit is contained in:
Andrey Novikov 2016-08-01 15:33:07 +03:00 committed by Emux
parent 8dce91b035
commit 89198c1a30
2 changed files with 58 additions and 8 deletions

View File

@ -1,6 +1,7 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016 devemux86 * Copyright 2016 devemux86
* Copyright 2016 Andrey Novikov
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -22,9 +23,9 @@ import android.os.Bundle;
import org.oscim.backend.CanvasAdapter; import org.oscim.backend.CanvasAdapter;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
import org.oscim.core.MercatorProjection; import org.oscim.core.MercatorProjection;
import org.oscim.layers.GroupLayer;
import org.oscim.layers.tile.buildings.BuildingLayer; import org.oscim.layers.tile.buildings.BuildingLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.map.Layers;
import org.oscim.renderer.BitmapRenderer; import org.oscim.renderer.BitmapRenderer;
import org.oscim.renderer.GLViewport; import org.oscim.renderer.GLViewport;
import org.oscim.scalebar.DefaultMapScaleBar; import org.oscim.scalebar.DefaultMapScaleBar;
@ -37,16 +38,22 @@ import org.oscim.theme.ThemeLoader;
import org.oscim.theme.VtmThemes; import org.oscim.theme.VtmThemes;
public class SimpleMapActivity extends BaseMapActivity { public class SimpleMapActivity extends BaseMapActivity {
private static final int GROUP_MAPS = 1;
private static final int GROUP_3D_OBJECTS = 2;
private static final int GROUP_OVERLAYS = 3;
private DefaultMapScaleBar mapScaleBar; private DefaultMapScaleBar mapScaleBar;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
GroupLayer groupLayer = new GroupLayer(mMap); Layers layers = mMap.layers();
groupLayer.layers.add(new BuildingLayer(mMap, mBaseLayer)); layers.addGroup(GROUP_MAPS);
groupLayer.layers.add(new LabelLayer(mMap, mBaseLayer)); layers.add(new LabelLayer(mMap, mBaseLayer), GROUP_MAPS);
mMap.layers().add(groupLayer); layers.addGroup(GROUP_3D_OBJECTS);
layers.add(new BuildingLayer(mMap, mBaseLayer), GROUP_3D_OBJECTS);
layers.addGroup(GROUP_OVERLAYS);
mapScaleBar = new DefaultMapScaleBar(mMap, CanvasAdapter.dpi / 160); mapScaleBar = new DefaultMapScaleBar(mMap, CanvasAdapter.dpi / 160);
mapScaleBar.setScaleBarMode(DefaultMapScaleBar.ScaleBarMode.BOTH); mapScaleBar.setScaleBarMode(DefaultMapScaleBar.ScaleBarMode.BOTH);
@ -58,7 +65,7 @@ public class SimpleMapActivity extends BaseMapActivity {
BitmapRenderer renderer = mapScaleBarLayer.getRenderer(); BitmapRenderer renderer = mapScaleBarLayer.getRenderer();
renderer.setPosition(GLViewport.Position.BOTTOM_LEFT); renderer.setPosition(GLViewport.Position.BOTTOM_LEFT);
renderer.setOffset(5 * CanvasAdapter.dpi / 160, 0); renderer.setOffset(5 * CanvasAdapter.dpi / 160, 0);
mMap.layers().add(mapScaleBarLayer); layers.add(mapScaleBarLayer, GROUP_OVERLAYS);
mMap.setTheme(VtmThemes.DEFAULT); mMap.setTheme(VtmThemes.DEFAULT);
} }

View File

@ -1,6 +1,7 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016 devemux86 * Copyright 2016 devemux86
* Copyright 2016 Andrey Novikov
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -27,20 +28,25 @@ import org.oscim.map.Map.UpdateListener;
import org.oscim.renderer.LayerRenderer; import org.oscim.renderer.LayerRenderer;
import java.util.AbstractList; import java.util.AbstractList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
public final class Layers extends AbstractList<Layer> { public final class Layers extends AbstractList<Layer> {
private final CopyOnWriteArrayList<Layer> mLayerList;
private final Map mMap; private final Map mMap;
private final List<Layer> mLayerList = new CopyOnWriteArrayList<>();
private final List<Integer> mGroupList = new ArrayList<>();
private final java.util.Map<Integer, Integer> mGroupIndex = new HashMap<>();
private boolean mDirtyLayers; private boolean mDirtyLayers;
private LayerRenderer[] mLayerRenderer; private LayerRenderer[] mLayerRenderer;
private Layer[] mLayers; private Layer[] mLayers;
Layers(Map map) { Layers(Map map) {
mMap = map; mMap = map;
mLayerList = new CopyOnWriteArrayList<>();
} }
@Override @Override
@ -79,6 +85,28 @@ public final class Layers extends AbstractList<Layer> {
mDirtyLayers = true; mDirtyLayers = true;
} }
/**
* Add using layer groups.
*/
public synchronized void add(Layer layer, int group) {
int index = mGroupList.indexOf(group);
if (index < 0)
throw new IllegalArgumentException("unknown layer group");
if (mLayerList.contains(layer))
throw new IllegalArgumentException("layer added twice");
index++;
if (index == mGroupList.size())
add(layer);
else {
add(mGroupIndex.get(mGroupList.get(index)), layer);
for (int i = index; i < mGroupList.size(); i++) {
group = mGroupList.get(i);
mGroupIndex.put(group, mGroupIndex.get(group) + 1);
}
}
}
@Override @Override
public synchronized Layer remove(int index) { public synchronized Layer remove(int index) {
mDirtyLayers = true; mDirtyLayers = true;
@ -102,6 +130,13 @@ public final class Layers extends AbstractList<Layer> {
} }
} }
// update layer group pointers
for (Integer group : mGroupIndex.keySet()) {
int pointer = mGroupIndex.get(group);
if (pointer > index)
mGroupIndex.put(group, pointer - 1);
}
return remove; return remove;
} }
@ -133,6 +168,14 @@ public final class Layers extends AbstractList<Layer> {
return remove; return remove;
} }
public synchronized void addGroup(int group) {
if (mGroupList.contains(group))
throw new IllegalArgumentException("group added twice");
mGroupList.add(group);
mGroupIndex.put(group, mLayerList.size());
}
/** /**
* Should only be used by MapRenderer. * Should only be used by MapRenderer.
* *