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 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);
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
*
|
*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user