From ac0455b1b466f82ae5290ba10cb5a47c2070ad20 Mon Sep 17 00:00:00 2001 From: Emux Date: Wed, 1 Mar 2017 14:54:02 +0200 Subject: [PATCH] Atlas multi-texture Android example #301 --- vtm-android-example/AndroidManifest.xml | 3 + .../test/AtlasMultiTextureActivity.java | 136 ++++++++++++++++++ .../src/org/oscim/android/test/Samples.java | 3 +- .../org/oscim/test/AtlasMultiTextureTest.java | 7 +- 4 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java diff --git a/vtm-android-example/AndroidManifest.xml b/vtm-android-example/AndroidManifest.xml index e0454b9a..5a68ce10 100644 --- a/vtm-android-example/AndroidManifest.xml +++ b/vtm-android-example/AndroidManifest.xml @@ -29,6 +29,9 @@ + diff --git a/vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java b/vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java new file mode 100644 index 00000000..83fc99af --- /dev/null +++ b/vtm-android-example/src/org/oscim/android/test/AtlasMultiTextureActivity.java @@ -0,0 +1,136 @@ +/* + * Copyright 2014 Hannes Janetzek + * Copyright 2016-2017 devemux86 + * Copyright 2017 Longri + * + * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). + * + * This program is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * this program. If not, see . + */ +package org.oscim.android.test; + +import android.graphics.drawable.Drawable; +import android.widget.Toast; + +import org.oscim.backend.CanvasAdapter; +import org.oscim.backend.canvas.Bitmap; +import org.oscim.backend.canvas.Canvas; +import org.oscim.backend.canvas.Color; +import org.oscim.backend.canvas.Paint; +import org.oscim.core.GeoPoint; +import org.oscim.layers.TileGridLayer; +import org.oscim.layers.marker.ItemizedLayer; +import org.oscim.layers.marker.MarkerItem; +import org.oscim.layers.marker.MarkerSymbol; +import org.oscim.layers.marker.MarkerSymbol.HotspotPlace; +import org.oscim.renderer.atlas.TextureAtlas; +import org.oscim.renderer.atlas.TextureRegion; +import org.oscim.utils.TextureAtlasUtils; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +import static org.oscim.android.canvas.AndroidGraphics.drawableToBitmap; + +public class AtlasMultiTextureActivity extends MarkerOverlayActivity { + + private java.util.Map regionsMap; + + @Override + void createLayers() { + mBitmapLayer.tileRenderer().setBitmapAlpha(0.5f); + + // Map events receiver + mMap.layers().add(new MapEventsReceiver(mMap)); + + /* directly load bitmap from resources */ + Bitmap bitmapPoi = drawableToBitmap(getResources(), R.drawable.marker_poi); + + /* another option: use some bitmap drawable */ + Drawable d = getResources().getDrawable(R.drawable.marker_focus); + Bitmap bitmapFocus = drawableToBitmap(d); + + // Create Atlas from Bitmaps + java.util.Map inputMap = new LinkedHashMap<>(); + regionsMap = new LinkedHashMap<>(); + List atlasList = new ArrayList<>(); + + inputMap.put("poi", bitmapPoi); + inputMap.put("focus", bitmapFocus); + + float scale = getResources().getDisplayMetrics().density; + Canvas canvas = CanvasAdapter.newCanvas(); + Paint paint = CanvasAdapter.newPaint(); + paint.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL); + paint.setTextSize(12 * scale); + paint.setStrokeWidth(2 * scale); + paint.setColor(Color.BLACK); + List pts = new ArrayList<>(); + for (double lat = -90; lat <= 90; lat += 10) { + for (double lon = -180; lon <= 180; lon += 10) { + String title = lat + "/" + lon; + pts.add(new MarkerItem(title, "", new GeoPoint(lat, lon))); + + Bitmap bmp = CanvasAdapter.newBitmap((int) (40 * scale), (int) (40 * scale), 0); + canvas.setBitmap(bmp); + canvas.fillColor(Color.GREEN); + + canvas.drawText(Double.toString(lat), 3 * scale, 17 * scale, paint); + canvas.drawText(Double.toString(lon), 3 * scale, 35 * scale, paint); + inputMap.put(title, bmp); + } + } + + // Bitmaps will never used any more + // With iOS we must flip the Y-Axis + TextureAtlasUtils.createTextureRegions(inputMap, regionsMap, atlasList, true, false); + + MarkerSymbol symbol; + if (BILLBOARDS) + symbol = new MarkerSymbol(regionsMap.get("poi"), HotspotPlace.BOTTOM_CENTER); + else + symbol = new MarkerSymbol(regionsMap.get("poi"), HotspotPlace.CENTER, false); + + if (BILLBOARDS) + mFocusMarker = new MarkerSymbol(regionsMap.get("focus"), HotspotPlace.BOTTOM_CENTER); + else + mFocusMarker = new MarkerSymbol(regionsMap.get("focus"), HotspotPlace.CENTER, false); + + mMarkerLayer = new ItemizedLayer<>(mMap, new ArrayList(), symbol, this); + mMap.layers().add(mMarkerLayer); + + mMarkerLayer.addItems(pts); + + mMap.layers().add(new TileGridLayer(mMap, getResources().getDisplayMetrics().density)); + + // set all markers + for (MarkerItem item : pts) { + MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(item.getTitle()), HotspotPlace.BOTTOM_CENTER); + item.setMarker(markerSymbol); + } + + Toast.makeText(this, "Atlas count: " + atlasList.size(), Toast.LENGTH_SHORT).show(); + } + + @Override + public boolean onItemSingleTapUp(int index, MarkerItem item) { + if (item.getMarker() == null) { + MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(item.getTitle()), HotspotPlace.BOTTOM_CENTER); + item.setMarker(markerSymbol); + } else + item.setMarker(null); + + Toast.makeText(this, "Marker tap\n" + item.getTitle(), Toast.LENGTH_SHORT).show(); + return true; + } +} diff --git a/vtm-android-example/src/org/oscim/android/test/Samples.java b/vtm-android-example/src/org/oscim/android/test/Samples.java index 52867f48..c0544af4 100644 --- a/vtm-android-example/src/org/oscim/android/test/Samples.java +++ b/vtm-android-example/src/org/oscim/android/test/Samples.java @@ -1,7 +1,7 @@ /* * Copyright 2010, 2011, 2012, 2013 mapsforge.org * Copyright 2013 Hannes Janetzek - * Copyright 2016 devemux86 + * Copyright 2016-2017 devemux86 * Copyright 2017 Longri * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). @@ -53,6 +53,7 @@ public class Samples extends Activity { linearLayout.addView(createButton(MarkerOverlayActivity.class)); linearLayout.addView(createButton(RotateMarkerOverlayActivity.class)); linearLayout.addView(createButton(AtlasMarkerOverlayActivity.class)); + linearLayout.addView(createButton(AtlasMultiTextureActivity.class)); linearLayout.addView(createButton(PathOverlayActivity.class)); linearLayout.addView(createButton(LineTexActivity.class)); linearLayout.addView(createButton(VectorLayerMapActivity.class)); diff --git a/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java b/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java index ddd2aba0..0a9ab8bc 100644 --- a/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java +++ b/vtm-playground/src/org/oscim/test/AtlasMultiTextureTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 devemux86 + * Copyright 2016-2017 devemux86 * Copyright 2017 Longri * * This program is free software: you can redistribute it and/or modify it under the @@ -109,8 +109,9 @@ public class AtlasMultiTextureTest extends MarkerLayerTest { mMap.layers().add(new TileGridLayer(mMap)); // set all markers - for (int i = 0; i < pts.size(); i++) { - onItemSingleTapUp(i, pts.get(i)); + for (MarkerItem item : pts) { + MarkerSymbol markerSymbol = new MarkerSymbol(regionsMap.get(item.getTitle()), HotspotPlace.BOTTOM_CENTER); + item.setMarker(markerSymbol); } System.out.println("Atlas count: " + atlasList.size());