1. fix performance issues
2. change touch layer map strategy git-svn-id: https://osmand.googlecode.com/svn/trunk@101 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
88a8da98b1
commit
b726918d38
12 changed files with 194 additions and 79 deletions
|
@ -20,9 +20,7 @@ public class ToDoConstants {
|
||||||
|
|
||||||
// 24. Implement ResourceManager, load cities/streets/buildings on Low memory (clear previous all addresses cities).
|
// 24. Implement ResourceManager, load cities/streets/buildings on Low memory (clear previous all addresses cities).
|
||||||
// 5. Search for city/streets/buildings
|
// 5. Search for city/streets/buildings
|
||||||
// 15. Investigate interruption of any long running operation & implement where it is needed.
|
|
||||||
// Fix progress information (loading indices).
|
|
||||||
|
|
||||||
// 8. Enable change POI directly on map (requires OSM login)
|
// 8. Enable change POI directly on map (requires OSM login)
|
||||||
// 16. Support open street bugs api.
|
// 16. Support open street bugs api.
|
||||||
// 20. Implement save track/route to gpx (?)
|
// 20. Implement save track/route to gpx (?)
|
||||||
|
@ -37,14 +35,19 @@ public class ToDoConstants {
|
||||||
// 9. When all features will be ready we can remove show location from context menu
|
// 9. When all features will be ready we can remove show location from context menu
|
||||||
|
|
||||||
// TODO SWING:
|
// TODO SWING:
|
||||||
// 1. Download tiles without using dir tiles
|
|
||||||
// 2. Configure file log & see log from file (add uncaught exception handling)
|
// 2. Configure file log & see log from file (add uncaught exception handling)
|
||||||
// 5. Implement suppress warning for duplicate id
|
// 5. Implement suppress warning for duplicate id
|
||||||
// 6. Implement renaming/deleting street/building/city
|
// 6. Implement renaming/deleting street/building/city
|
||||||
|
// 8. Implement basic transliteration version
|
||||||
// 7. Implement saving bundle of tiles in different folder
|
// 7. Implement saving bundle of tiles in different folder
|
||||||
|
// 1. Download tiles without using dir tiles
|
||||||
|
|
||||||
|
|
||||||
// DONE ANDROID :
|
// DONE ANDROID :
|
||||||
|
// 15. Investigate interruption of any long running operation & implement where it is needed.
|
||||||
|
// ProgressDialogImplementation should support setOnCancelListener or obtain CANCEL message &
|
||||||
|
// throw InterruptedException in all methods (remaining, progress, startTask, ...) when call it.
|
||||||
|
// Otherwise thread could be stopped however it is not good method.
|
||||||
// 21. Implement zooming tile (if tile doesn't exist local, we can zoom in previous tile).
|
// 21. Implement zooming tile (if tile doesn't exist local, we can zoom in previous tile).
|
||||||
// 11. Print out additional info speed, altitude, number of satellites
|
// 11. Print out additional info speed, altitude, number of satellites
|
||||||
// 19. Show how map is rotated where north/south on map (do not consider compass)
|
// 19. Show how map is rotated where north/south on map (do not consider compass)
|
||||||
|
|
|
@ -80,13 +80,20 @@ public class AmenityIndexRepository {
|
||||||
cLeftLongitude = 0;
|
cLeftLongitude = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void evaluateCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, List<Amenity> toFill){
|
public void evaluateCachedAmenities(double topLatitude, double leftLongitude, double bottomLatitude, double rightLongitude, List<Amenity> toFill){
|
||||||
cachedAmenities.clear();
|
cachedAmenities.clear();
|
||||||
cTopLatitude = topLatitude + (topLatitude -bottomLatitude);
|
cTopLatitude = topLatitude + (topLatitude -bottomLatitude);
|
||||||
cBottomLatitude = bottomLatitude - (topLatitude -bottomLatitude);
|
cBottomLatitude = bottomLatitude - (topLatitude -bottomLatitude);
|
||||||
cLeftLongitude = leftLongitude - (rightLongitude - leftLongitude);
|
cLeftLongitude = leftLongitude - (rightLongitude - leftLongitude);
|
||||||
cRightLongitude = rightLongitude + (rightLongitude - leftLongitude);
|
cRightLongitude = rightLongitude + (rightLongitude - leftLongitude);
|
||||||
searchAmenities(cTopLatitude, cLeftLongitude, cBottomLatitude, cRightLongitude, -1, null, cachedAmenities);
|
// first of all put all entities in temp list in order to not freeze other read threads
|
||||||
|
ArrayList<Amenity> tempList = new ArrayList<Amenity>();
|
||||||
|
searchAmenities(cTopLatitude, cLeftLongitude, cBottomLatitude, cRightLongitude, -1, null, tempList);
|
||||||
|
synchronized (this) {
|
||||||
|
cachedAmenities.clear();
|
||||||
|
cachedAmenities.addAll(tempList);
|
||||||
|
}
|
||||||
|
|
||||||
checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, toFill);
|
checkCachedAmenities(topLatitude, leftLongitude, bottomLatitude, rightLongitude, toFill);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ public class ProgressDialogImplementation implements IProgress {
|
||||||
private String message = "";
|
private String message = "";
|
||||||
|
|
||||||
private Handler mViewUpdateHandler;
|
private Handler mViewUpdateHandler;
|
||||||
|
private Thread run;
|
||||||
|
|
||||||
public ProgressDialogImplementation(final ProgressDialog dlg){
|
public ProgressDialogImplementation(final ProgressDialog dlg){
|
||||||
mViewUpdateHandler = new Handler(){
|
mViewUpdateHandler = new Handler(){
|
||||||
|
@ -24,6 +25,17 @@ public class ProgressDialogImplementation implements IProgress {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setRunnable(String threadName, Runnable run){
|
||||||
|
this.run = new Thread(run, threadName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(){
|
||||||
|
if(run == null){
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
run.start();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void progress(int deltaWork) {
|
public void progress(int deltaWork) {
|
||||||
|
|
|
@ -93,12 +93,14 @@ public class ResourceManager {
|
||||||
return getTileImageForMap(map, x, y, zoom, loadFromInternetIfNeeded, true, true);
|
return getTileImageForMap(map, x, y, zoom, loadFromInternetIfNeeded, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Bitmap getTileImageForMap(ITileSource map, int x, int y, int zoom,
|
// introduce cache in order save memory
|
||||||
|
protected StringBuilder builder = new StringBuilder(40);
|
||||||
|
protected synchronized Bitmap getTileImageForMap(ITileSource map, int x, int y, int zoom,
|
||||||
boolean loadFromInternetIfNeeded, boolean sync, boolean loadFromFs) {
|
boolean loadFromInternetIfNeeded, boolean sync, boolean loadFromFs) {
|
||||||
if (map == null) {
|
if (map == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
StringBuilder builder = new StringBuilder(40);
|
builder.setLength(0);
|
||||||
builder.append(map.getName()).append('/').append(zoom). append('/').append(x).
|
builder.append(map.getName()).append('/').append(zoom). append('/').append(x).
|
||||||
append('/').append(y).append(map.getTileFormat()).append(".tile");
|
append('/').append(y).append(map.getTileFormat()).append(".tile");
|
||||||
String file = builder.toString();
|
String file = builder.toString();
|
||||||
|
|
|
@ -47,9 +47,9 @@ public class MainMenuActivity extends Activity {
|
||||||
public void startApplication(){
|
public void startApplication(){
|
||||||
if(!applicationAlreadyStarted){
|
if(!applicationAlreadyStarted){
|
||||||
// TODO exception!!! has leaked window ?
|
// TODO exception!!! has leaked window ?
|
||||||
final ProgressDialog dlg = ProgressDialog.show(this, "Loading data", "Reading indices...");
|
final ProgressDialog dlg = ProgressDialog.show(this, "Loading data", "Reading indices...", true);
|
||||||
final ProgressDialogImplementation impl = new ProgressDialogImplementation(dlg);
|
final ProgressDialogImplementation impl = new ProgressDialogImplementation(dlg);
|
||||||
new Thread("Reader indexes") {
|
impl.setRunnable("Initializing app", new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
|
@ -59,7 +59,8 @@ public class MainMenuActivity extends Activity {
|
||||||
dlg.dismiss();
|
dlg.dismiss();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.start();
|
});
|
||||||
|
impl.run();
|
||||||
applicationAlreadyStarted = true;
|
applicationAlreadyStarted = true;
|
||||||
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler());
|
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler());
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ import android.os.Handler;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
import android.os.PowerManager.WakeLock;
|
import android.os.PowerManager.WakeLock;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
@ -28,6 +29,7 @@ import android.widget.ImageButton;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import android.widget.ZoomControls;
|
import android.widget.ZoomControls;
|
||||||
|
|
||||||
|
import com.osmand.LogUtil;
|
||||||
import com.osmand.OsmandSettings;
|
import com.osmand.OsmandSettings;
|
||||||
import com.osmand.R;
|
import com.osmand.R;
|
||||||
import com.osmand.ResourceManager;
|
import com.osmand.ResourceManager;
|
||||||
|
@ -125,9 +127,9 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
backToLocation.setOnClickListener(new OnClickListener(){
|
backToLocation.setOnClickListener(new OnClickListener(){
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
backToLocation.setVisibility(View.INVISIBLE);
|
||||||
if(!isMapLinkedToLocation()){
|
if(!isMapLinkedToLocation()){
|
||||||
getPreferences(MODE_WORLD_READABLE).edit().putBoolean(BACK_TO_LOCATION, true).commit();
|
getPreferences(MODE_WORLD_READABLE).edit().putBoolean(BACK_TO_LOCATION, true).commit();
|
||||||
backToLocation.setVisibility(View.INVISIBLE);
|
|
||||||
if(locationLayer.getLastKnownLocation() != null){
|
if(locationLayer.getLastKnownLocation() != null){
|
||||||
Location lastKnownLocation = locationLayer.getLastKnownLocation();
|
Location lastKnownLocation = locationLayer.getLastKnownLocation();
|
||||||
mapView.setLatLon(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude());
|
mapView.setLatLon(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude());
|
||||||
|
@ -152,14 +154,6 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
SharedPreferences lprefs = getPreferences(MODE_WORLD_READABLE);
|
|
||||||
if(navigationLayer.getPointToNavigate() == null){
|
|
||||||
lprefs.edit().remove(POINT_NAVIGATE_LAT).remove(POINT_NAVIGATE_LON).commit();
|
|
||||||
} else {
|
|
||||||
LatLon p = navigationLayer.getPointToNavigate();
|
|
||||||
lprefs.edit().putFloat(POINT_NAVIGATE_LAT, (float) p.getLatitude()).
|
|
||||||
putFloat(POINT_NAVIGATE_LON, (float) p.getLongitude()).commit();
|
|
||||||
}
|
|
||||||
MapTileDownloader.getInstance().removeDownloaderCallback(mapView);
|
MapTileDownloader.getInstance().removeDownloaderCallback(mapView);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,12 +163,14 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
// show point view only if gps enabled
|
// show point view only if gps enabled
|
||||||
if(location == null){
|
if(location == null){
|
||||||
if(sensorRegistered) {
|
if(sensorRegistered) {
|
||||||
|
Log.d(LogUtil.TAG, "Disable sensor");
|
||||||
((SensorManager) getSystemService(SENSOR_SERVICE)).unregisterListener(this);
|
((SensorManager) getSystemService(SENSOR_SERVICE)).unregisterListener(this);
|
||||||
sensorRegistered = false;
|
sensorRegistered = false;
|
||||||
locationLayer.setHeading(null, true);
|
locationLayer.setHeading(null, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(!sensorRegistered && OsmandSettings.isShowingViewAngle(this)){
|
if(!sensorRegistered && OsmandSettings.isShowingViewAngle(this)){
|
||||||
|
Log.d(LogUtil.TAG, "Enable sensor");
|
||||||
SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
|
SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
|
||||||
Sensor s = sensorMgr.getDefaultSensor(Sensor.TYPE_ORIENTATION);
|
Sensor s = sensorMgr.getDefaultSensor(Sensor.TYPE_ORIENTATION);
|
||||||
if (s != null) {
|
if (s != null) {
|
||||||
|
@ -183,7 +179,7 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
sensorRegistered = true;
|
sensorRegistered = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Log.d(LogUtil.TAG, "Location changed");
|
||||||
locationLayer.setLastKnownLocation(location, true);
|
locationLayer.setLastKnownLocation(location, true);
|
||||||
if (location != null) {
|
if (location != null) {
|
||||||
if (isMapLinkedToLocation()) {
|
if (isMapLinkedToLocation()) {
|
||||||
|
@ -267,6 +263,9 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
if(!OsmandSettings.isRotateMapToBearing(this)){
|
if(!OsmandSettings.isRotateMapToBearing(this)){
|
||||||
mapView.setRotate(0);
|
mapView.setRotate(0);
|
||||||
}
|
}
|
||||||
|
if(!OsmandSettings.isShowingViewAngle(this)){
|
||||||
|
locationLayer.setHeading(null, true);
|
||||||
|
}
|
||||||
mapView.setMapPosition(OsmandSettings.getPositionOnMap(this));
|
mapView.setMapPosition(OsmandSettings.getPositionOnMap(this));
|
||||||
SharedPreferences prefs = getSharedPreferences(OsmandSettings.SHARED_PREFERENCES_NAME, MODE_WORLD_READABLE);
|
SharedPreferences prefs = getSharedPreferences(OsmandSettings.SHARED_PREFERENCES_NAME, MODE_WORLD_READABLE);
|
||||||
if(prefs != null && prefs.contains(OsmandSettings.LAST_KNOWN_MAP_LAT)){
|
if(prefs != null && prefs.contains(OsmandSettings.LAST_KNOWN_MAP_LAT)){
|
||||||
|
@ -274,7 +273,7 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
mapView.setLatLon(l.getLatitude(), l.getLongitude());
|
mapView.setLatLon(l.getLatitude(), l.getLongitude());
|
||||||
mapView.setZoom(OsmandSettings.getLastKnownMapZoom(this));
|
mapView.setZoom(OsmandSettings.getLastKnownMapZoom(this));
|
||||||
}
|
}
|
||||||
if(getLastKnownLocation() != null){
|
if(getLastKnownLocation() != null && !isMapLinkedToLocation()){
|
||||||
backToLocation.setVisibility(View.VISIBLE);
|
backToLocation.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
backToLocation.setVisibility(View.INVISIBLE);
|
backToLocation.setVisibility(View.INVISIBLE);
|
||||||
|
@ -312,7 +311,9 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
public void locationChanged(double newLatitude, double newLongitude, Object source) {
|
public void locationChanged(double newLatitude, double newLongitude, Object source) {
|
||||||
// when user start dragging
|
// when user start dragging
|
||||||
if(locationLayer.getLastKnownLocation() != null){
|
if(locationLayer.getLastKnownLocation() != null){
|
||||||
getPreferences(MODE_WORLD_READABLE).edit().putBoolean(BACK_TO_LOCATION, false).commit();
|
if(isMapLinkedToLocation()){
|
||||||
|
getPreferences(MODE_WORLD_READABLE).edit().putBoolean(BACK_TO_LOCATION, false).commit();
|
||||||
|
}
|
||||||
if (backToLocation.getVisibility() != View.VISIBLE) {
|
if (backToLocation.getVisibility() != View.VISIBLE) {
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -328,6 +329,14 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
MenuInflater inflater = getMenuInflater();
|
MenuInflater inflater = getMenuInflater();
|
||||||
inflater.inflate(R.menu.map_menu, menu);
|
inflater.inflate(R.menu.map_menu, menu);
|
||||||
|
MenuItem item = menu.findItem(R.id.map_navigate_to_point);
|
||||||
|
if (item != null) {
|
||||||
|
if (getPreferences(MODE_WORLD_READABLE).contains(POINT_NAVIGATE_LAT)) {
|
||||||
|
item.setTitle(R.string.stop_navigation);
|
||||||
|
} else {
|
||||||
|
item.setTitle(R.string.navigate_to_point);
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,9 +357,13 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
return true;
|
return true;
|
||||||
} else if (item.getItemId() == R.id.map_navigate_to_point) {
|
} else if (item.getItemId() == R.id.map_navigate_to_point) {
|
||||||
if(navigationLayer.getPointToNavigate() != null){
|
if(navigationLayer.getPointToNavigate() != null){
|
||||||
|
getPreferences(MODE_WORLD_READABLE).edit().remove(POINT_NAVIGATE_LAT).remove(POINT_NAVIGATE_LON).commit();
|
||||||
item.setTitle(R.string.navigate_to_point);
|
item.setTitle(R.string.navigate_to_point);
|
||||||
navigateToPoint(null);
|
navigateToPoint(null);
|
||||||
} else {
|
} else {
|
||||||
|
getPreferences(MODE_WORLD_READABLE).edit().
|
||||||
|
putFloat(POINT_NAVIGATE_LAT, (float) mapView.getLatitude()).
|
||||||
|
putFloat(POINT_NAVIGATE_LON, (float) mapView.getLongitude()).commit();
|
||||||
item.setTitle(R.string.stop_navigation);
|
item.setTitle(R.string.stop_navigation);
|
||||||
navigateToPoint(new LatLon(mapView.getLatitude(), mapView.getLongitude()));
|
navigateToPoint(new LatLon(mapView.getLatitude(), mapView.getLongitude()));
|
||||||
}
|
}
|
||||||
|
@ -371,7 +384,7 @@ public class MapActivity extends Activity implements LocationListener, IMapLocat
|
||||||
public void onSensorChanged(SensorEvent event) {
|
public void onSensorChanged(SensorEvent event) {
|
||||||
// using that strange technique because sensor produces a lot of events & hangs the system
|
// using that strange technique because sensor produces a lot of events & hangs the system
|
||||||
locationLayer.setHeading(event.values[0], true);
|
locationLayer.setHeading(event.values[0], true);
|
||||||
if(!sensorHandler.hasMessages(1)){
|
if(!sensorHandler.hasMessages(1) && locationLayer.isLocationVisible(locationLayer.getLastKnownLocation())){
|
||||||
Message m = Message.obtain(sensorHandler, new Runnable(){
|
Message m = Message.obtain(sensorHandler, new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
@ -4,10 +4,10 @@ import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Path;
|
import android.graphics.Path;
|
||||||
|
import android.graphics.PointF;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.graphics.Paint.Style;
|
import android.graphics.Paint.Style;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.view.MotionEvent;
|
|
||||||
|
|
||||||
import com.osmand.activities.MapActivity;
|
import com.osmand.activities.MapActivity;
|
||||||
import com.osmand.osm.MapUtils;
|
import com.osmand.osm.MapUtils;
|
||||||
|
@ -130,10 +130,6 @@ public class MapInfoLayer implements OsmandMapLayer {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroyLayer() {
|
public void destroyLayer() {
|
||||||
|
@ -144,5 +140,15 @@ public class MapInfoLayer implements OsmandMapLayer {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongPressEvent(PointF point) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(PointF point) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package com.osmand.views;
|
package com.osmand.views;
|
||||||
|
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.view.MotionEvent;
|
import android.graphics.PointF;
|
||||||
|
|
||||||
public interface OsmandMapLayer {
|
public interface OsmandMapLayer {
|
||||||
|
|
||||||
|
@ -12,7 +12,9 @@ public interface OsmandMapLayer {
|
||||||
|
|
||||||
public void destroyLayer();
|
public void destroyLayer();
|
||||||
|
|
||||||
public boolean onTouchEvent(MotionEvent event);
|
public boolean onTouchEvent(PointF point);
|
||||||
|
|
||||||
|
public boolean onLongPressEvent(PointF point);
|
||||||
|
|
||||||
public boolean drawInScreenPixels();
|
public boolean drawInScreenPixels();
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,10 @@ import android.util.FloatMath;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.SurfaceHolder;
|
import android.view.SurfaceHolder;
|
||||||
import android.view.SurfaceView;
|
import android.view.SurfaceView;
|
||||||
|
import android.view.View;
|
||||||
import android.view.SurfaceHolder.Callback;
|
import android.view.SurfaceHolder.Callback;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
|
import android.view.View.OnLongClickListener;
|
||||||
|
|
||||||
import com.osmand.LogUtil;
|
import com.osmand.LogUtil;
|
||||||
import com.osmand.OsmandSettings;
|
import com.osmand.OsmandSettings;
|
||||||
|
@ -33,7 +36,8 @@ import com.osmand.map.ITileSource;
|
||||||
import com.osmand.osm.MapUtils;
|
import com.osmand.osm.MapUtils;
|
||||||
import com.osmand.views.AnimateDraggingMapThread.AnimateDraggingCallback;
|
import com.osmand.views.AnimateDraggingMapThread.AnimateDraggingCallback;
|
||||||
|
|
||||||
public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCallback, Callback, AnimateDraggingCallback{
|
public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCallback,
|
||||||
|
Callback, AnimateDraggingCallback, OnLongClickListener, OnClickListener{
|
||||||
|
|
||||||
protected final int emptyTileDivisor = 16;
|
protected final int emptyTileDivisor = 16;
|
||||||
protected final int timeForDraggingAnimation = 300;
|
protected final int timeForDraggingAnimation = 300;
|
||||||
|
@ -67,6 +71,7 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
|
||||||
private PointF startDragging = null;
|
private PointF startDragging = null;
|
||||||
private PointF autoStartDragging = null;
|
private PointF autoStartDragging = null;
|
||||||
private long autoStartDraggingTime = 0;
|
private long autoStartDraggingTime = 0;
|
||||||
|
private boolean wasMapDraggedOnTouch = false;
|
||||||
|
|
||||||
Paint paintGrayFill;
|
Paint paintGrayFill;
|
||||||
Paint paintWhiteFill;
|
Paint paintWhiteFill;
|
||||||
|
@ -109,6 +114,10 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
|
||||||
paintBitmap.setFilterBitmap(true);
|
paintBitmap.setFilterBitmap(true);
|
||||||
|
|
||||||
setClickable(true);
|
setClickable(true);
|
||||||
|
setLongClickable(true);
|
||||||
|
setOnLongClickListener(this);
|
||||||
|
setOnClickListener(this);
|
||||||
|
|
||||||
getHolder().addCallback(this);
|
getHolder().addCallback(this);
|
||||||
|
|
||||||
animatedDraggingThread = new AnimateDraggingMapThread();
|
animatedDraggingThread = new AnimateDraggingMapThread();
|
||||||
|
@ -520,50 +529,91 @@ public class OsmandMapTileView extends SurfaceView implements IMapDownloaderCall
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isDifferenceSmallToDrag(PointF point, MotionEvent event){
|
||||||
|
return Math.abs(point.x - event.getX()) + Math.abs(point.y - event.getY()) <= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
for (int i = layers.size() - 1; i >= 0; i--) {
|
|
||||||
if (layers.get(i).onTouchEvent(event)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(event.getAction() == MotionEvent.ACTION_DOWN) {
|
if(event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||||
animatedDraggingThread.stopDragging();
|
animatedDraggingThread.stopDragging();
|
||||||
|
// possibly solution to always reset start dragging ? (in order someone forget to do it)
|
||||||
if(startDragging == null){
|
if(startDragging == null){
|
||||||
autoStartDragging = new PointF(event.getX(), event.getY());
|
autoStartDragging = new PointF(event.getX(), event.getY());
|
||||||
autoStartDraggingTime = event.getEventTime();
|
autoStartDraggingTime = event.getEventTime();
|
||||||
startDragging = new PointF(event.getX(), event.getY());
|
startDragging = new PointF(event.getX(), event.getY());
|
||||||
|
wasMapDraggedOnTouch = false;
|
||||||
}
|
}
|
||||||
|
// registering long press action
|
||||||
|
return super.onTouchEvent(event);
|
||||||
} else if(event.getAction() == MotionEvent.ACTION_UP) {
|
} else if(event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
if(startDragging != null){
|
if(startDragging != null){
|
||||||
dragTo(startDragging.x, startDragging.y, event.getX(), event.getY());
|
if (wasMapDraggedOnTouch || !isDifferenceSmallToDrag(startDragging, event)) {
|
||||||
startDragging = null;
|
dragTo(startDragging.x, startDragging.y, event.getX(), event.getY());
|
||||||
if(wasMapDraggingAccelerated(event)){
|
startDragging = null;
|
||||||
float timeDist = (int) (event.getEventTime() - autoStartDraggingTime);
|
if (wasMapDraggingAccelerated(event)) {
|
||||||
if(timeDist < 20){
|
float timeDist = (int) (event.getEventTime() - autoStartDraggingTime);
|
||||||
timeDist = 20;
|
if (timeDist < 20) {
|
||||||
|
timeDist = 20;
|
||||||
|
}
|
||||||
|
animatedDraggingThread.startDragging(timeDist, autoStartDragging.x, autoStartDragging.y, event.getX(), event.getY());
|
||||||
}
|
}
|
||||||
animatedDraggingThread.startDragging(timeDist, autoStartDragging.x, autoStartDragging.y,
|
} else {
|
||||||
event.getX(), event.getY());
|
// Do not forget to reset startDragging = null in performClick()
|
||||||
|
// give chance to run performClick() or performLongClick()
|
||||||
|
return super.onTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} else if(event.getAction() == MotionEvent.ACTION_MOVE) {
|
} else if(event.getAction() == MotionEvent.ACTION_MOVE) {
|
||||||
if(startDragging != null){
|
if(startDragging != null && !isDifferenceSmallToDrag(startDragging, event)){
|
||||||
dragTo(startDragging.x, startDragging.y, event.getX(), event.getY());
|
// try to not drag map if that first time & diff small
|
||||||
// save memory do not create new PointF
|
if (wasMapDraggedOnTouch || !isDifferenceSmallToDrag(startDragging, event)) {
|
||||||
startDragging.x = event.getX();
|
if(!wasMapDraggedOnTouch){
|
||||||
startDragging.y = event.getY();
|
cancelLongPress();
|
||||||
if(event.getEventTime() - autoStartDraggingTime > timeForDraggingAnimation){
|
wasMapDraggedOnTouch = true;
|
||||||
autoStartDraggingTime = event.getEventTime();
|
}
|
||||||
autoStartDragging.x = event.getX();
|
dragTo(startDragging.x, startDragging.y, event.getX(), event.getY());
|
||||||
autoStartDragging.y = event.getY();
|
// save memory do not create new PointF
|
||||||
|
startDragging.x = event.getX();
|
||||||
|
startDragging.y = event.getY();
|
||||||
|
if (event.getEventTime() - autoStartDraggingTime > timeForDraggingAnimation) {
|
||||||
|
autoStartDraggingTime = event.getEventTime();
|
||||||
|
autoStartDragging.x = event.getX();
|
||||||
|
autoStartDragging.y = event.getY();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View v) {
|
||||||
|
PointF point = startDragging;
|
||||||
|
if (point != null) {
|
||||||
|
startDragging = null;
|
||||||
|
for (int i = layers.size() - 1; i >= 0; i--) {
|
||||||
|
if (layers.get(i).onLongPressEvent(point)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
PointF point = startDragging;
|
||||||
|
if (point != null) {
|
||||||
|
startDragging = null;
|
||||||
|
for (int i = layers.size() - 1; i >= 0; i--) {
|
||||||
|
if (layers.get(i).onTouchEvent(point)) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return super.onTouchEvent(event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,9 +6,9 @@ import java.util.List;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.PointF;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.osmand.ResourceManager;
|
import com.osmand.ResourceManager;
|
||||||
|
@ -16,7 +16,8 @@ import com.osmand.data.Amenity;
|
||||||
import com.osmand.osm.MapUtils;
|
import com.osmand.osm.MapUtils;
|
||||||
|
|
||||||
public class POIMapLayer implements OsmandMapLayer {
|
public class POIMapLayer implements OsmandMapLayer {
|
||||||
private static final int radiusClick = 2; // for 15 level zoom
|
// it is very slow to use with 15 level
|
||||||
|
private static final int startZoom = 16;
|
||||||
|
|
||||||
private Paint pointAltUI;
|
private Paint pointAltUI;
|
||||||
private OsmandMapTileView view;
|
private OsmandMapTileView view;
|
||||||
|
@ -24,13 +25,17 @@ public class POIMapLayer implements OsmandMapLayer {
|
||||||
|
|
||||||
private ResourceManager resourceManager;
|
private ResourceManager resourceManager;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongPressEvent(PointF point) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
public boolean onTouchEvent(PointF point) {
|
||||||
if (event.getAction() == MotionEvent.ACTION_DOWN && objects != null) {
|
if (objects != null) {
|
||||||
int ex = (int) event.getX();
|
int ex = (int) point.x;
|
||||||
int ey = (int) event.getY();
|
int ey = (int) point.y;
|
||||||
int radius = getRadiusPoi(view.getZoom()) * 3 / 2;
|
int radius = getRadiusPoi(view.getZoom()) * 3 / 2;
|
||||||
try {
|
try {
|
||||||
for (int i = 0; i < objects.size(); i++) {
|
for (int i = 0; i < objects.size(); i++) {
|
||||||
|
@ -46,7 +51,6 @@ public class POIMapLayer implements OsmandMapLayer {
|
||||||
// that's really rare case, but is much efficient than introduce synchronized block
|
// that's really rare case, but is much efficient than introduce synchronized block
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// return super.onTouchEvent(event);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,11 +72,15 @@ public class POIMapLayer implements OsmandMapLayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getRadiusPoi(int zoom){
|
public int getRadiusPoi(int zoom){
|
||||||
if(zoom < 15){
|
if(zoom < startZoom){
|
||||||
return 0;
|
return 0;
|
||||||
|
} else if(zoom == 16){
|
||||||
|
return 6;
|
||||||
|
} else if(zoom == 17){
|
||||||
|
return 10;
|
||||||
} else {
|
} else {
|
||||||
return radiusClick << (zoom - 15);
|
return 14;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect pixRect = new Rect();
|
Rect pixRect = new Rect();
|
||||||
|
@ -80,7 +88,7 @@ public class POIMapLayer implements OsmandMapLayer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDraw(Canvas canvas) {
|
public void onDraw(Canvas canvas) {
|
||||||
if (view.getZoom() >= 15) {
|
if (view.getZoom() >= startZoom) {
|
||||||
pixRect.set(0, 0, view.getWidth(), view.getHeight());
|
pixRect.set(0, 0, view.getWidth(), view.getHeight());
|
||||||
view.calculateTileRectangle(pixRect, view.getCenterPointX(),
|
view.calculateTileRectangle(pixRect, view.getCenterPointX(),
|
||||||
view.getCenterPointY(), view.getXTile(), view.getYTile(), tileRect);
|
view.getCenterPointY(), view.getXTile(), view.getYTile(), tileRect);
|
||||||
|
|
|
@ -5,10 +5,10 @@ import android.graphics.Color;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Path;
|
import android.graphics.Path;
|
||||||
|
import android.graphics.PointF;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.graphics.Paint.Style;
|
import android.graphics.Paint.Style;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.view.MotionEvent;
|
|
||||||
|
|
||||||
import com.osmand.osm.MapUtils;
|
import com.osmand.osm.MapUtils;
|
||||||
|
|
||||||
|
@ -61,10 +61,6 @@ public class PointLocationLayer implements OsmandMapLayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private RectF getHeadingRect(int locationX, int locationY){
|
private RectF getHeadingRect(int locationX, int locationY){
|
||||||
int rad = Math.min(3*view.getWidth()/8, 3*view.getHeight()/8);
|
int rad = Math.min(3*view.getWidth()/8, 3*view.getHeight()/8);
|
||||||
|
@ -160,6 +156,16 @@ public class PointLocationLayer implements OsmandMapLayer {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongPressEvent(PointF point) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(PointF point) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@ import android.graphics.Color;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Path;
|
import android.graphics.Path;
|
||||||
|
import android.graphics.PointF;
|
||||||
import android.graphics.Paint.Style;
|
import android.graphics.Paint.Style;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.view.MotionEvent;
|
|
||||||
|
|
||||||
import com.osmand.osm.LatLon;
|
import com.osmand.osm.LatLon;
|
||||||
|
|
||||||
|
@ -39,11 +39,6 @@ public class PointNavigationLayer implements OsmandMapLayer {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent event) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDraw(Canvas canvas) {
|
public void onDraw(Canvas canvas) {
|
||||||
|
@ -103,4 +98,14 @@ public class PointNavigationLayer implements OsmandMapLayer {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onLongPressEvent(PointF point) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(PointF point) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue