Add support for layer groups, closes #103
This commit is contained in:
parent
8dce91b035
commit
89198c1a30
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Copyright 2013 Hannes Janetzek
|
||||
* Copyright 2016 devemux86
|
||||
* Copyright 2016 Andrey Novikov
|
||||
*
|
||||
* 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.core.MapPosition;
|
||||
import org.oscim.core.MercatorProjection;
|
||||
import org.oscim.layers.GroupLayer;
|
||||
import org.oscim.layers.tile.buildings.BuildingLayer;
|
||||
import org.oscim.layers.tile.vector.labeling.LabelLayer;
|
||||
import org.oscim.map.Layers;
|
||||
import org.oscim.renderer.BitmapRenderer;
|
||||
import org.oscim.renderer.GLViewport;
|
||||
import org.oscim.scalebar.DefaultMapScaleBar;
|
||||
@ -37,16 +38,22 @@ import org.oscim.theme.ThemeLoader;
|
||||
import org.oscim.theme.VtmThemes;
|
||||
|
||||
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;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
GroupLayer groupLayer = new GroupLayer(mMap);
|
||||
groupLayer.layers.add(new BuildingLayer(mMap, mBaseLayer));
|
||||
groupLayer.layers.add(new LabelLayer(mMap, mBaseLayer));
|
||||
mMap.layers().add(groupLayer);
|
||||
Layers layers = mMap.layers();
|
||||
layers.addGroup(GROUP_MAPS);
|
||||
layers.add(new LabelLayer(mMap, mBaseLayer), GROUP_MAPS);
|
||||
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.setScaleBarMode(DefaultMapScaleBar.ScaleBarMode.BOTH);
|
||||
@ -58,7 +65,7 @@ public class SimpleMapActivity extends BaseMapActivity {
|
||||
BitmapRenderer renderer = mapScaleBarLayer.getRenderer();
|
||||
renderer.setPosition(GLViewport.Position.BOTTOM_LEFT);
|
||||
renderer.setOffset(5 * CanvasAdapter.dpi / 160, 0);
|
||||
mMap.layers().add(mapScaleBarLayer);
|
||||
layers.add(mapScaleBarLayer, GROUP_OVERLAYS);
|
||||
|
||||
mMap.setTheme(VtmThemes.DEFAULT);
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Copyright 2013 Hannes Janetzek
|
||||
* Copyright 2016 devemux86
|
||||
* Copyright 2016 Andrey Novikov
|
||||
*
|
||||
* 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 java.util.AbstractList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public final class Layers extends AbstractList<Layer> {
|
||||
|
||||
private final CopyOnWriteArrayList<Layer> mLayerList;
|
||||
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 LayerRenderer[] mLayerRenderer;
|
||||
private Layer[] mLayers;
|
||||
|
||||
Layers(Map map) {
|
||||
mMap = map;
|
||||
mLayerList = new CopyOnWriteArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -79,6 +85,28 @@ public final class Layers extends AbstractList<Layer> {
|
||||
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
|
||||
public synchronized Layer remove(int index) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -133,6 +168,14 @@ public final class Layers extends AbstractList<Layer> {
|
||||
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.
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user