了解地图何时停止滚动(如 javascript API 中的“moveend”)

2024-01-06

我需要检测 MapView 何时滚动或缩放,例如 javascript API 中的“moveend”事件。我想等到视图停止移动,这样我就可以检测是否需要向服务器查询查看矩形内的项目,如果需要,则发出请求。 (实际上我发送了一个比查看矩形稍大的区域的请求)

显然,如果视图仍在移动,我宁愿不发送数据请求。但更糟糕的是,我不知道我需要发送另一个请求,导致地图上的区域丢失标记。

目前,我正在子类化 MapView 并处理 onTouchEvent,如下所示:

 public boolean onTouchEvent(android.view.MotionEvent ev) {
        super.onTouchEvent (ev);
        if (ev.getAction() == MotionEvent.ACTION_UP) {
            GeoPoint center = getMapCenter();
            int latSpan = getLatitudeSpan(), lngSpan = getLongitudeSpan();
            /* (check if it has moved enough to need a new set of data)  */    
        }
        return true;
    }

问题是,我不知道视图是否已停止,因为滚动往往具有惯性并且可以继续经过“ACTION_UP”事件。

是否有一些我可以点击的事件会在地图视图完成移动(或缩放)时提醒我?如果没有,有人编写逻辑来检测这一点吗?理论上,我可以通过查看所有操作来进行猜测,并设置一些稍后出现的内容并检查它......但是......这看起来很混乱并且是 PITA。但如果有人已经写了......:)


这是我目前正在使用的方法,我已经使用过并测试过,效果很好。 只要确保你做了你的draw()方法高效。 (避免其中GC)。

//In map activity

class MyMapActivity extends MapActivity {


  protected void onCreate(Bundle savedState){
    setContent(R.layout.activity_map);
    super.onCreate(savedSate);

    OnMapMoveListener mapListener = new OnMapMoveListener(){
      public void mapMovingFinishedEvent(){
        Log.d("MapActivity", "Hey look! I stopped scrolling!");
      }
    }

    // Create overlay
    OnMoveOverlay mOnMoveOverlay = new OnMoveOverlay(mapListener);

    // Add overlay to view.
    MapView mapView = (MapView)findViewById(R.id.map_view);

    // Make sure you add as the last overlay so its on the top. 
    // Otherwise other overlays could steal the touchEvent;
    mapView.getOverlays().add(mOnMoveOverlay);
  }

}

这是您的 OnMoveOverlay 类

//OnMoveOverlay

class OnMoveOverlay extends Overlay
{

    private static GeoPoint lastLatLon = new GeoPoint(0, 0);
    private static GeoPoint currLatLon;

            // Event listener to listen for map finished moving events
            private OnMapMoveListener eventListener = null;

    protected boolean isMapMoving = false;

            public OnMoveOverlay(OnMapMoveListener eventLis){
              //Set event listener
              eventListener = eventLis;
            }

    @Override  
    public boolean onTouchEvent(android.view.MotionEvent ev)
    {
        super.onTouchEvent(ev);
        if (ev.getAction() == MotionEvent.ACTION_UP)
        {
            // Added to example to make more complete
            isMapMoving = true;
        }
        //Fix: changed to false as it would handle the touch event and not pass back.
        return false;
    }

    @Override  
    public void draw(Canvas canvas, MapView mapView, boolean shadow)
    {
        if (!shadow)
        {
            if (isMapMoving)
            {
                currLatLon = mapView.getProjection().fromPixels(0, 0);
                if (currLatLon.equals(lastLatLon))
                {
                    isMapMoving = false;
                    eventListener.mapMovingFinishedEvent();
                }
                else
                {
                    lastLatLon = currLatLon;
                }
            }
        }
    }

            public interface OnMapMoveListener{
                public void mapMovingFinishedEvent();
            }
}

只需实现你自己的监听器eventListener.mapMovingFinishedEvent();并通过上面的另一种方法触发地图移动布尔并进行排序。

这个想法是,当地图移动时,像素投影到坐标将会改变,一旦它们相同,你就完成了移动。

我已经用更新的更完整的代码更新了它,它的双重绘制存在问题。

我们不对阴影通道做任何事情,因为我们只是对每个绘制通道进行双重计算,这是一种浪费。

随意问任何问题 :)

谢谢, 克里斯

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解地图何时停止滚动(如 javascript API 中的“moveend”) 的相关文章

随机推荐

  • 使用 asyncio 实现非阻塞 I/O

    我正在尝试使用 Pygame 和 asyncio 编写一个网络游戏 但我不知道如何避免挂起读取 这是我为客户提供的代码 asyncio coroutine def handle client print Connected reader w
  • glmnet 的公式接口

    在过去的几个月里 我参与了许多项目 在这些项目中我使用了glmnet适合弹性网模型的封装 它很棒 但与大多数 R 建模函数相比 其界面相当简陋 特别是 您必须给出响应向量和预测矩阵 而不是指定公式和数据框 您还会失去常规界面提供的许多生活质
  • 快速解析非本地时区中的 Python 日期时间,并根据夏令时进行调整

    我需要快速将 ISO 8601 日期时间字符串 字符串中没有时区 但已知位于美国 太平洋时区 转换为 numpydatetime64 object 如果我的机器处于美国 太平洋时间 我可以简单地运行numpy datetime64 s 但是
  • SQL 和 MySQL 有什么区别? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是数据库新手 我想知道 两者之间有
  • 有关 Google Play 应用程序资产加密的问题

    从 v4 1 开始果冻豆 http developer android com about versions jelly bean html 谷歌为Google Play推出了新的应用程序资产加密功能 升级应用程序时似乎出现了一些问题 其中
  • Spread Operator 不适用于基于 Redux/ES6 的示例

    我正在尝试理解 Dan Abramov 发布的 Redux 在线教程 目前我正在使用以下示例 带有数组的Reducer组合 https egghead io lessons javascript redux reducer composit
  • Windows 窗体图表设置固定混合标签

    我想将标签固定在 x 或 y 轴上 因此它们始终是静态的 我还想将标签与数字和字符串混合在一起 如图所示 另外y轴从 1开始 我怎么能总是从0开始呢 Setting CustomLabels https msdn microsoft com
  • 汇编中的内存分配和寻址

    我正在尝试学习汇编 但有一些指令我不完全理解其目的 C code include
  • 如何获取 PHP 函数中的函数名称?

    是否可以 function test echo function name is test 准确的方法是使用 FUNCTION 预定义魔法常数 http www php net manual en language constants pr
  • 父级的 jQuery 父级

    我目前正在尝试查找元素的父元素的父元素 我点击了一个链接 该链接位于 td 我想得到 tr object 为什么 this parent parent 不起作用 会怎样 Thanks Brendan Edit 看来我的语法错误导致了整个事情
  • 在 Altair 折线图末尾添加标签

    所以我一直在尝试获取它 以便在每行末尾都有一个标签 给出国家 地区名称 然后我可以删除图例 尝试过玩transform filter但没有运气 我使用了这里的数据https ourworldindata org coronavirus so
  • Java 客户端中的 TLS 与 SNI

    目前正在就该问题进行讨论NHIN Direct 安全与信任工作组 http nhindirect org message list Security and Trust Workgroup 关于传统 SSL 产生的 IP 到域映射问题 ht
  • 如何在 selenium python 中的相对 css 选择器中使用父选择器

    我将尽力解释这个问题 这个问题是关于Python中的selenium 考虑这个例子 for row in driver find elements By CSS SELECTOR div style overflow hidden gt d
  • 使用 C# 的形式制作动画 Gif

    在我的项目中 每当执行一个长流程时 都会显示一个小表单和一个小动画 gif 文件 我使用 this Show 打开表单 使用 this Close 关闭表单 以下是我使用的代码 public partial class PlzWaitMes
  • 并行运行多个 JPA 事务

    我有两个 或更多 Java 线程使用 JPA 从 mysql 数据库创建 更新和删除实体 为了实现这一目标 我有一个 PersistenceLayer 类创建 EntityManager 并为我的所有实体提供保存 更新和删除方法 如下所示
  • 使用 maven 在 Google App Engine 上部署 SpringBoot / Angular 4

    我尝试在 Google Cloud 上部署应用程序 目前免费帐户 前端 Angular 和后端 Java JPA Spring Boot 是使用 Maven 在单个 jar 中构建的 在本地 在我的服务器上使用 Jenkins 和 Goog
  • 在 Common Lisp 中,如何以可移植的方式检查对象的类型

    我想定义一个专门处理具有无符号字节 8 元素的数组类型对象的方法 在 sbcl 中 当你 make array x element type unsigned byte 8 对象类由 SB KERNEL SIMPLE ARRAY UNSIG
  • C# - 通过引用传递值类型的良好且灵活的方法?

    我的问题缩小为简单的解释如下 我有一个类需要使用一个可能会发生变化的数字 不改变它 这个数字不一定来自另一个类 它可以是任何东西 但我只想将它 交给 类一次 而不是不断地调用更新方法或必须创建一个包装器 从那以后 正如我所说 这应该适用于任
  • StringBuilder .equals Java

    class strb static public void main String string StringBuilder s1 new StringBuilder Test StringBuilder s2 new StringBuil
  • 了解地图何时停止滚动(如 javascript API 中的“moveend”)

    我需要检测 MapView 何时滚动或缩放 例如 javascript API 中的 moveend 事件 我想等到视图停止移动 这样我就可以检测是否需要向服务器查询查看矩形内的项目 如果需要 则发出请求 实际上我发送了一个比查看矩形稍大的