android – 如何捕捉地图平移和缩放真的完成了?

前端之家收集整理的这篇文章主要介绍了android – 如何捕捉地图平移和缩放真的完成了?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个应用程序,将在用户平移或放大时动态加载数据进行映射.

我需要跟踪地图何时完成以更改其视图状态(停止平移或缩放),然后加载用于创建标记的新部分数据.但事实上,Google Maps API没有任何事件来处理这个问题.

有一些方法,例如创建一个空的覆盖以控制onTouch事件等等,但是在用户完成他的触摸之后,地图平移可以持续很长时间,因为GMaps使用某种惯性使平移更平滑.

我试图子类化MapView,但是它的draw()方法是final,因此它不能被覆盖.

任何想法如何精确处理平移和缩放整理?

解决方法

发现了一些研究时间和一些决定.它有一些缺点和职业,我将进一步描述.

我们应该做的主要事情是覆盖一些MapView的方法来处理它的绘图行为.如果我们不能覆盖draw()方法,我们应该找到另一种方法.另外一个派生从View可能会被覆盖 – computeScroll()方法.反复称为地图继续填充.所有我们要做的是设置一些时间阈值来捕获如果这次不再调用computeScroll.
这是我做的:

  1. import java.util.Timer;
  2. import java.util.TimerTask;
  3.  
  4. import android.content.Context;
  5. import android.util.AttributeSet;
  6. import android.view.MotionEvent;
  7.  
  8. import com.google.android.maps.GeoPoint;
  9. import com.google.android.maps.MapView;
  10.  
  11. public class EnhancedMapView extends MapView {
  12. public interface OnZoomChangeListener {
  13. public void onZoomChange(MapView view,int newZoom,int oldZoom);
  14. }
  15.  
  16. public interface OnPanChangeListener {
  17. public void onPanChange(MapView view,GeoPoint newCenter,GeoPoint oldCenter);
  18. }
  19.  
  20. private EnhancedMapView _this;
  21.  
  22. // Set this variable to your preferred timeout
  23. private long events_timeout = 500L;
  24. private boolean is_touched = false;
  25. private GeoPoint last_center_pos;
  26. private int last_zoom;
  27. private Timer zoom_event_delay_timer = new Timer();
  28. private Timer pan_event_delay_timer = new Timer();
  29.  
  30. private EnhancedMapView.OnZoomChangeListener zoom_change_listener;
  31. private EnhancedMapView.OnPanChangeListener pan_change_listener;
  32.  
  33.  
  34. public EnhancedMapView(Context context,String apiKey) {
  35. super(context,apiKey);
  36. _this = this;
  37. last_center_pos = this.getMapCenter();
  38. last_zoom = this.getZoomLevel();
  39. }
  40.  
  41. public EnhancedMapView(Context context,AttributeSet attrs) {
  42. super(context,attrs);
  43. }
  44.  
  45. public EnhancedMapView(Context context,AttributeSet attrs,int defStyle) {
  46. super(context,attrs,defStyle);
  47. }
  48.  
  49. public void setOnZoomChangeListener(EnhancedMapView.OnZoomChangeListener l) {
  50. zoom_change_listener = l;
  51. }
  52.  
  53. public void setOnPanChangeListener(EnhancedMapView.OnPanChangeListener l) {
  54. pan_change_listener = l;
  55. }
  56.  
  57. @Override
  58. public boolean onTouchEvent(MotionEvent ev) {
  59. if (ev.getAction() == 1) {
  60. is_touched = false;
  61. } else {
  62. is_touched = true;
  63. }
  64.  
  65. return super.onTouchEvent(ev);
  66. }
  67.  
  68. @Override
  69. public void computeScroll() {
  70. super.computeScroll();
  71.  
  72. if (getZoomLevel() != last_zoom) {
  73. // if computeScroll called before timer counts down we should drop it and start it over again
  74. zoom_event_delay_timer.cancel();
  75. zoom_event_delay_timer = new Timer();
  76. zoom_event_delay_timer.schedule(new TimerTask() {
  77. @Override
  78. public void run() {
  79. zoom_change_listener.onZoomChange(_this,getZoomLevel(),last_zoom);
  80. last_zoom = getZoomLevel();
  81. }
  82. },events_timeout);
  83. }
  84.  
  85. // Send event only when map's center has changed and user stopped touching the screen
  86. if (!last_center_pos.equals(getMapCenter()) || !is_touched) {
  87. pan_event_delay_timer.cancel();
  88. pan_event_delay_timer = new Timer();
  89. pan_event_delay_timer.schedule(new TimerTask() {
  90. @Override
  91. public void run() {
  92. pan_change_listener.onPanChange(_this,getMapCenter(),last_center_pos);
  93. last_center_pos = getMapCenter();
  94. }
  95. },events_timeout);
  96. }
  97. }
  98.  
  99. }

那么你应该在MapActivity中注册事件处理程序,如下所示:

  1. public class YourMapActivity extends MapActivity {
  2.  
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6.  
  7. mv = new EnhancedMapView(this,"<your Maps API key here>");
  8.  
  9. mv.setClickable(true);
  10. mv.setBuiltInZoomControls(true);
  11.  
  12. mv.setOnZoomChangeListener(new EnhancedMapView.OnZoomChangeListener() {
  13. @Override
  14. public void onZoomChange(MapView view,int oldZoom) {
  15. Log.d("test","zoom changed from " + oldZoom + " to " + newZoom);
  16. }
  17. }
  18. mv.setOnPanChangeListener(new EnhancedMapView.OnPanChangeListener() {
  19. public void onPanChange(MapView view,GeoPoint oldCenter) {
  20. Log.d("test","center changed from " + oldCenter.getLatitudeE6() + "," + oldCenter.getLongitudeE6() + " to " + newCenter.getLatitudeE6() + "," + newCenter.getLongitudeE6());
  21. }
  22. }
  23. }

那么这种方法的优点和缺点呢?
优点:
– 事件处理任一方式地图被平移或缩放.触摸事件,使用的硬件键,甚至编程触发的事件都被处理(如setZoom()或animate()方法).
– 如果用户快速点击缩放按钮,可以跳过不必要的数据加载.点击停止后,事件将触发.
缺点:
– 很不可能取消放大或平移动作(也许我会在将来添加这个能力)

希望这个小班会帮你.

猜你在找的Android相关文章