Advertisement
Guest User

Untitled

a guest
Jul 12th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.02 KB | None | 0 0
  1. package com.sajjady.simplegis;
  2.  
  3. import androidx.annotation.NonNull;
  4. import androidx.appcompat.app.AppCompatActivity;
  5.  
  6. import android.annotation.SuppressLint;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.Color;
  9. import android.graphics.PointF;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.util.Log;
  13. import android.view.MotionEvent;
  14. import android.view.View;
  15. import android.view.ViewOverlay;
  16. import android.widget.Button;
  17.  
  18. import com.mapbox.android.gestures.AndroidGesturesManager;
  19. import com.mapbox.android.gestures.BaseGesture;
  20. import com.mapbox.android.gestures.ShoveGestureDetector;
  21. import com.mapbox.android.gestures.StandardGestureDetector;
  22. import com.mapbox.geojson.Feature;
  23. import com.mapbox.geojson.FeatureCollection;
  24. import com.mapbox.geojson.LineString;
  25. import com.mapbox.geojson.Point;
  26. import com.mapbox.mapboxsdk.Mapbox;
  27. import com.mapbox.mapboxsdk.geometry.LatLng;
  28. import com.mapbox.mapboxsdk.maps.MapView;
  29. import com.mapbox.mapboxsdk.maps.MapboxMap;
  30. import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
  31. import com.mapbox.mapboxsdk.maps.Projection;
  32. import com.mapbox.mapboxsdk.maps.Style;
  33. import com.mapbox.mapboxsdk.plugins.annotation.LineManager;
  34. import com.mapbox.mapboxsdk.plugins.annotation.SymbolManager;
  35. import com.mapbox.mapboxsdk.plugins.annotation.SymbolOptions;
  36. import com.mapbox.mapboxsdk.style.layers.LineLayer;
  37. import com.mapbox.mapboxsdk.style.layers.Property;
  38. import com.mapbox.mapboxsdk.style.layers.PropertyFactory;
  39. import com.mapbox.mapboxsdk.style.layers.SymbolLayer;
  40. import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
  41. import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
  42.  
  43. import java.util.ArrayList;
  44.  
  45.  
  46. public class MainActivity extends AppCompatActivity {
  47. private MapboxMap mapboxMap;
  48. private static final String TAG = "MainActivity";
  49. private MapView mapView;
  50. private Button buttonMove;
  51. private Boolean mapIsMotionLess = false;
  52. private LineManager lineManager;
  53. private Handler handler = new Handler();
  54. private Style style;
  55. private AndroidGesturesManager gesturesManager;
  56. private LatLng animatedPosition;
  57. private Boolean screenIsLockedFor = false;
  58. private GeoJsonSource geoJsonSource;
  59. private Runnable runnableCode = new Runnable() {
  60. @Override
  61. public void run() {
  62. if (gesturesManager.getDetectors().get(0).getCurrentEvent().getAction() != MotionEvent.ACTION_UP) {
  63. handler.postDelayed(this, 100);
  64. } else {
  65. screenIsLockedFor = false;
  66. removeLayerAndSource(style, "linelayer", "line-source");
  67. handler.removeCallbacks(this);
  68. }
  69. }
  70.  
  71. };
  72.  
  73. // Create the Handler object (on the main thread by default)
  74. @SuppressLint("ClickableViewAccessibility")
  75. @Override
  76. protected void onCreate(Bundle savedInstanceState) {
  77. super.onCreate(savedInstanceState);
  78. Mapbox.getInstance(this, "sk.eyJ1Ijoic2R5dXNzdWYiLCJhIjoiY2p4ZmxoOWoyMDhteTNubDFnMnJzZjJmZSJ9.Ac-TKeogqZR7iNzChWSFxA");
  79. setContentView(R.layout.activity_main);
  80.  
  81. buttonMove = findViewById(R.id.lock_move);
  82. mapView = findViewById(R.id.mapView);
  83. mapView.onCreate(savedInstanceState);
  84. mapView.getMapAsync(new OnMapReadyCallback() {
  85. @Override
  86. public void onMapReady(@NonNull MapboxMap mapboxMap) {
  87. MainActivity.this.mapboxMap = mapboxMap;
  88. mapboxMap.setStyle(Style.LIGHT, new Style.OnStyleLoaded() {
  89.  
  90. @SuppressLint("ClickableViewAccessibility")
  91. @Override
  92. public void onStyleLoaded(@NonNull Style style) {
  93. MainActivity.this.style = style;
  94. style.setTransition(new TransitionOptions(0, 0, true));
  95. style.addImage("marker-icon-id",
  96. BitmapFactory.decodeResource(
  97. MainActivity.this.getResources(), R.drawable.mapbox_marker_icon_default));
  98. GeoJsonSource geoJsonSource = new GeoJsonSource("source-id", Feature.fromGeometry(
  99. Point.fromLngLat(-87.679, 41.885)));
  100. style.addSource(geoJsonSource);
  101. SymbolLayer symbolLayer = new SymbolLayer("layer-id", "source-id");
  102. symbolLayer.withProperties(
  103. PropertyFactory.iconImage("marker-icon-id")
  104. );
  105. style.addLayer(symbolLayer);
  106. //------
  107. // second marker
  108. style.addImage("marker-icon-id2",
  109. BitmapFactory.decodeResource(
  110. MainActivity.this.getResources(), R.drawable.mapbox_marker_icon_default));
  111. GeoJsonSource geoJsonSource2 = new GeoJsonSource("source-id2", Feature.fromGeometry(
  112. Point.fromLngLat(36.2605, 59.6168)));
  113. style.addSource(geoJsonSource2);
  114. SymbolLayer symbolLayer2 = new SymbolLayer("layer-id2", "source-id2");
  115. symbolLayer2.withProperties(
  116. PropertyFactory.iconImage("marker-icon-id2")
  117. );
  118. style.addLayer(symbolLayer2);
  119. lineManager = new LineManager(mapView, mapboxMap, style);
  120. buttonMove.setOnClickListener(new View.OnClickListener() {
  121. @Override
  122. public void onClick(View view) {
  123. changeMapMotionStatus();
  124. }
  125. });
  126.  
  127. AndroidGesturesManager gesturesManager = mapboxMap.getGesturesManager();
  128. MainActivity.this.gesturesManager = gesturesManager;
  129. gesturesManager.setStandardGestureListener(new StandardGestureDetector.StandardOnGestureListener() {
  130. @Override
  131. public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
  132. return false;
  133. }
  134.  
  135. @Override
  136. public boolean onDoubleTap(MotionEvent motionEvent) {
  137. return false;
  138. }
  139.  
  140. @Override
  141. public boolean onDoubleTapEvent(MotionEvent motionEvent) {
  142. return false;
  143. }
  144.  
  145. @Override
  146. public boolean onDown(MotionEvent motionEvent) {
  147. if (mapIsMotionLess) {
  148. if (!screenIsLockedFor) {
  149. handler.post(runnableCode);
  150. }
  151. screenIsLockedFor = true;
  152. matchLine(motionEvent, style);
  153. }
  154. return true;
  155. }
  156.  
  157. @Override
  158. public void onShowPress(MotionEvent motionEvent) {
  159.  
  160. }
  161.  
  162. @Override
  163. public boolean onSingleTapUp(MotionEvent motionEvent) {
  164. return false;
  165. }
  166.  
  167. @Override
  168. public boolean onScroll(MotionEvent firstEvent, MotionEvent secondEvent, float distanceX, float distanceY) {
  169. if (mapIsMotionLess) {
  170. if (!screenIsLockedFor) {
  171. handler.post(runnableCode);
  172. }
  173. screenIsLockedFor = true;
  174. matchLine(secondEvent, style);
  175. Log.e(TAG, "onScroll: second" + secondEvent.getAction());
  176. }
  177. return true;
  178. }
  179.  
  180. @Override
  181. public void onLongPress(MotionEvent motionEvent) {
  182. removeLayerAndSource(style, "linelayer", "line-source");
  183. }
  184.  
  185. @Override
  186. public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
  187. return false;
  188. }
  189. });
  190.  
  191. }
  192. });
  193. }
  194. });
  195. }
  196.  
  197. private void changeMapMotionStatus() {
  198. mapboxMap.getUiSettings().setZoomGesturesEnabled(mapIsMotionLess);
  199. mapboxMap.getUiSettings().setScrollGesturesEnabled(mapIsMotionLess);
  200. mapIsMotionLess = !mapIsMotionLess;
  201. }
  202.  
  203. // Add the mapView's own lifecycle methods to the activity's lifecycle methods
  204. @Override
  205. public void onStart() {
  206. super.onStart();
  207. mapView.onStart();
  208. }
  209.  
  210. @Override
  211. public void onResume() {
  212. super.onResume();
  213. mapView.onResume();
  214. }
  215.  
  216. @Override
  217. public void onPause() {
  218. super.onPause();
  219. mapView.onPause();
  220. }
  221.  
  222. @Override
  223. public void onStop() {
  224. super.onStop();
  225. mapView.onStop();
  226. }
  227.  
  228. @Override
  229. public void onLowMemory() {
  230. super.onLowMemory();
  231. mapView.onLowMemory();
  232. }
  233.  
  234. @Override
  235. protected void onDestroy() {
  236. super.onDestroy();
  237. mapView.onDestroy();
  238. }
  239.  
  240. @Override
  241. protected void onSaveInstanceState(Bundle outState) {
  242. super.onSaveInstanceState(outState);
  243. mapView.onSaveInstanceState(outState);
  244. }
  245.  
  246. private void matchLine(MotionEvent motionEvent, @NonNull Style style) {
  247. LatLng endPointLatLng = motionEventPointToLatLng(new PointF(), motionEvent);
  248. ArrayList<Point> routeCoordinates = getCoordinates(endPointLatLng);
  249. if (style.getSource("line-source") == null) {
  250. drawLine(style, routeCoordinates);
  251. } else {
  252. geoJsonSource.setGeoJson(FeatureCollection.fromFeatures(new Feature[]{Feature.fromGeometry(
  253. LineString.fromLngLats(routeCoordinates)
  254. )}));
  255. /*removeLayerAndSource(style, "linelayer", "line-source");
  256. drawLine(style, routeCoordinates);*/
  257. }
  258. }
  259.  
  260. private LatLng motionEventPointToLatLng(PointF pointF, MotionEvent motionEvent) {
  261. pointF.x = motionEvent.getX();
  262. pointF.y = motionEvent.getY();
  263. Projection projection = mapboxMap.getProjection();
  264. return projection.fromScreenLocation(pointF);
  265. }
  266.  
  267. private void removeLayerAndSource(Style style, String layerName, String sourceName) {
  268. style.removeLayer(layerName);
  269. style.removeSource(sourceName);
  270. }
  271.  
  272. private ArrayList<Point> getCoordinates(LatLng endPoint) {
  273. ArrayList<Point> routeCoordinates = new ArrayList<>();
  274. routeCoordinates.add(Point.fromLngLat(endPoint.getLongitude(), endPoint.getLatitude()));
  275. routeCoordinates.add(Point.fromLngLat(-87.679, 41.885));
  276. return routeCoordinates;
  277. }
  278.  
  279. private void drawLine(Style style, ArrayList<Point> routeCoordinates) {
  280. style.addLayer(new LineLayer("linelayer", "line-source").withProperties(
  281. PropertyFactory.lineDasharray(new Float[]{0.01f, 2f}),
  282. PropertyFactory.lineCap(Property.LINE_CAP_ROUND),
  283. PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND),
  284. PropertyFactory.lineWidth(5f),
  285. PropertyFactory.lineColor(Color.parseColor("#e55e5e"))
  286. ));
  287. geoJsonSource = new GeoJsonSource("line-source",
  288. FeatureCollection.fromFeatures(new Feature[]{Feature.fromGeometry(
  289. LineString.fromLngLats(routeCoordinates)
  290. )}));
  291. style.addSource(geoJsonSource);
  292.  
  293. }
  294.  
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement