kopia lustrzana https://github.com/sh123/codec2_talkie
Porównaj commity
2 Commity
d79c24f602
...
e6a05091d9
Autor | SHA1 | Data |
---|---|---|
sh123 | e6a05091d9 | |
sh123 | 6c3700809a |
|
@ -3,12 +3,14 @@ package com.radio.codec2talkie.maps;
|
|||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.location.Location;
|
||||
import android.os.Bundle;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
@ -22,6 +24,7 @@ import com.radio.codec2talkie.R;
|
|||
import com.radio.codec2talkie.protocol.Aprs;
|
||||
import com.radio.codec2talkie.protocol.aprs.tools.AprsSymbolTable;
|
||||
import com.radio.codec2talkie.settings.PreferenceKeys;
|
||||
import com.radio.codec2talkie.tools.UnitTools;
|
||||
|
||||
import org.osmdroid.api.IMapController;
|
||||
import org.osmdroid.config.Configuration;
|
||||
|
@ -31,8 +34,11 @@ import org.osmdroid.views.MapView;
|
|||
import org.osmdroid.views.overlay.compass.CompassOverlay;
|
||||
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;
|
||||
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
|
||||
import org.osmdroid.views.overlay.mylocation.IMyLocationProvider;
|
||||
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
public class MapActivity extends AppCompatActivity {
|
||||
private static final String TAG = MapActivity.class.getSimpleName();
|
||||
|
||||
|
@ -45,6 +51,10 @@ public class MapActivity extends AppCompatActivity {
|
|||
|
||||
private MapStations _mapStations;
|
||||
private boolean _rotateMap = false;
|
||||
private boolean _shouldFollowLocation = false;
|
||||
|
||||
private String _positionInfo;
|
||||
private double _prevBearing = 0.0;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
@ -57,11 +67,6 @@ public class MapActivity extends AppCompatActivity {
|
|||
|
||||
Context context = getApplicationContext();
|
||||
Configuration.getInstance().setUserAgentValue(Aprs.APRS_ID + " " + BuildConfig.VERSION_NAME);
|
||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
// my symbol
|
||||
AprsSymbolTable aprsSymbolTable = AprsSymbolTable.getInstance(context);
|
||||
String mySymbolCode = sharedPreferences.getString(PreferenceKeys.APRS_SYMBOL, "/[");
|
||||
|
||||
// map
|
||||
_mapView = findViewById(R.id.map);
|
||||
|
@ -87,15 +92,62 @@ public class MapActivity extends AppCompatActivity {
|
|||
_mapView.getOverlays().add(compassOverlay);
|
||||
|
||||
// my location
|
||||
_myLocationNewOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(context), _mapView);
|
||||
Bitmap myBitmapIcon = aprsSymbolTable.bitmapFromSymbol(mySymbolCode, true);
|
||||
if (AprsSymbolTable.needsRotation(mySymbolCode)) {
|
||||
Matrix matrix = new Matrix();
|
||||
matrix.postRotate(-90);
|
||||
myBitmapIcon = Bitmap.createBitmap(myBitmapIcon, 0, 0, myBitmapIcon.getWidth(), myBitmapIcon.getHeight(), matrix, true);
|
||||
_myLocationNewOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(context), _mapView) {
|
||||
@Override
|
||||
public void onLocationChanged(Location location, IMyLocationProvider source) {
|
||||
super.onLocationChanged(location, source);
|
||||
_positionInfo = String.format(Locale.US, "%dkm/h, %d°, %dm, %s, %f, %f",
|
||||
UnitTools.metersPerSecondToKilometersPerHour((int)location.getSpeed()),
|
||||
(int)location.getBearing(),
|
||||
(int)location.getAltitude(),
|
||||
UnitTools.decimalToMaidenhead(location.getLatitude(), location.getLongitude()),
|
||||
location.getLatitude(),
|
||||
location.getLongitude()
|
||||
);
|
||||
|
||||
double currentBearing = location.getBearing();
|
||||
|
||||
if (_prevBearing > 180 && currentBearing <= 180)
|
||||
updateMyIcon(false);
|
||||
else if (_prevBearing <= 180 && currentBearing > 180)
|
||||
updateMyIcon(true);
|
||||
|
||||
_prevBearing = currentBearing;
|
||||
}
|
||||
_myLocationNewOverlay.setDirectionIcon(myBitmapIcon);
|
||||
_myLocationNewOverlay.setPersonIcon(myBitmapIcon);
|
||||
|
||||
@Override
|
||||
public void draw(Canvas pCanvas, MapView pMapView, boolean pShadow) {
|
||||
super.draw(pCanvas, pMapView, pShadow);
|
||||
if (_positionInfo == null || !_shouldFollowLocation) return;
|
||||
|
||||
// create paint
|
||||
Paint paint = new Paint();
|
||||
paint.setStyle(Paint.Style.FILL);
|
||||
paint.setTextSize(24);
|
||||
|
||||
// query bounds from text
|
||||
Rect bounds = new Rect();
|
||||
paint.getTextBounds(_positionInfo, 0, _positionInfo.length(), bounds);
|
||||
|
||||
// draw background
|
||||
paint.setColor(Color.WHITE);
|
||||
paint.setAlpha(200);
|
||||
pCanvas.drawRect(pCanvas.getWidth() - bounds.width(),
|
||||
0,
|
||||
pCanvas.getWidth(),
|
||||
bounds.height(),
|
||||
paint);
|
||||
|
||||
// draw text
|
||||
paint.setColor(Color.BLACK);
|
||||
paint.setAlpha(255);
|
||||
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
|
||||
pCanvas.drawText(_positionInfo, pCanvas.getWidth() - bounds.width(), bounds.height(), paint);
|
||||
}
|
||||
};
|
||||
|
||||
// set own icon
|
||||
updateMyIcon(false);
|
||||
|
||||
// my location overlay
|
||||
_myLocationNewOverlay.enableMyLocation();
|
||||
|
@ -109,6 +161,28 @@ public class MapActivity extends AppCompatActivity {
|
|||
_mapStations = new MapStations(context, _mapView, this);
|
||||
}
|
||||
|
||||
public void updateMyIcon(boolean shouldFlip) {
|
||||
Context context = getApplicationContext();
|
||||
Configuration.getInstance().setUserAgentValue(Aprs.APRS_ID + " " + BuildConfig.VERSION_NAME);
|
||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
// my symbol
|
||||
AprsSymbolTable aprsSymbolTable = AprsSymbolTable.getInstance(context);
|
||||
String mySymbolCode = sharedPreferences.getString(PreferenceKeys.APRS_SYMBOL, "/[");
|
||||
|
||||
Bitmap myBitmapIcon = aprsSymbolTable.bitmapFromSymbol(mySymbolCode, true);
|
||||
if (AprsSymbolTable.needsRotation(mySymbolCode)) {
|
||||
Matrix matrix = new Matrix();
|
||||
matrix.postRotate(-90);
|
||||
if (shouldFlip) {
|
||||
matrix.postScale(-1, 1, myBitmapIcon.getWidth() / 2f, myBitmapIcon.getHeight() / 2f);
|
||||
}
|
||||
myBitmapIcon = Bitmap.createBitmap(myBitmapIcon, 0, 0, myBitmapIcon.getWidth(), myBitmapIcon.getHeight(), matrix, true);
|
||||
}
|
||||
_myLocationNewOverlay.setDirectionIcon(myBitmapIcon);
|
||||
_myLocationNewOverlay.setPersonIcon(myBitmapIcon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.map_menu, menu);
|
||||
|
@ -166,9 +240,11 @@ public class MapActivity extends AppCompatActivity {
|
|||
} else if (itemId == R.id.map_menu_move_map) {
|
||||
if (item.isChecked()) {
|
||||
item.setChecked(false);
|
||||
_shouldFollowLocation = false;
|
||||
_myLocationNewOverlay.disableFollowLocation();
|
||||
} else {
|
||||
item.setChecked(true);
|
||||
_shouldFollowLocation = true;
|
||||
_myLocationNewOverlay.enableFollowLocation();
|
||||
_mapController.zoomTo(MAP_FOLLOW_ZOOM);
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue