gpt4 book ai didi

android - 在触摸事件期间从后台线程更新 UI

转载 作者:行者123 更新时间:2023-11-29 00:40:24 25 4
gpt4 key购买 nike

我正在尝试从后台线程向 MapView 添加叠加层,以光学方式标记用户当前触摸的点。

目前我尝试使用计时器/处理程序来实现这一点。当 MotionEvent 为 ACTION_DOWN 时,我发布了一个任务,该任务在一定延迟后将圆形叠加层添加到 mapView 叠加层。

遗憾的是,用户界面仅在用户将手指从屏幕上移开 (ACTION_UP) 后才会更新。

示例代码如下:

界面线程

if (event.getAction() == MotionEvent.ACTION_DOWN) {
handler = new OverlayHandler(mapView, centerDrawer) // centerDrawer is an overlay drawing a circle
cTask = new DrawTimer(handler); // Calls handler.sendMessage, telling the handler to add centerDraw to the overlays of mapView

handler.postDelayed(cTast, delay);

} else {
handler.removeCallbacks(cTask);
}

计时器(DrawTimer 等)

public void run() {
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}

处理程序

public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
mapView.getOverlays().add(centerDrawer);
break;
// more cases
}
super.handleMessage(msg);
}

据我所知,这是从后台任务与 UI 交互的默认方式。

这是否也适用于用户与屏幕交互时的更新?我是否必须明确告诉 View 呈现新叠加层?

编辑:

代码应执行以下操作:触摸时,它应该开始观察用户持续触摸多长时间。在最初的延迟之后,应该将圆圈添加到 View 中。再延迟一段时间后,会添加另一个叠加层,依此类推。

我分两步为每个叠加层执行此操作:我将一个 Runnable 添加到要在延迟后执行的处理程序。然后 Runnable 将相应的消息发送给处理程序,告诉它要绘制什么。我这样做是因为...

  • 我需要能够在用户移动或松开手指时取消计时器(帖子)。
  • 当用户不断触摸屏幕时,一些叠加层应该会发生变化。 postDelayed Runnable 一直发送消息直到取消。

这就是为什么我不只使用延迟消息。

用例

  • 用户触摸屏幕 -> 用户在延迟过去之前释放(不应出现任何内容)

  • 触摸 -> 延迟传球 -> 画圈 -> 释放

  • 触摸 -> 延迟传球 -> 画圈 -> 延迟 2 传球 -> 画圈 2 -> 释放

最佳答案

您的评论说“调用 handler.sendMessage ...”,但随后您将延迟发布到处理程序。您要么想调用 sendMessage 或 postDelayed,但不能同时调用两者。您将消息放入队列 2x。但这不一定能解释您的问题。

您应该发布 DelayTimer 的代码,并检查 delay 的值。

关于android - 在触摸事件期间从后台线程更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9760882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com