gpt4 book ai didi

java - 检测触摸按压与长按与 move ?

转载 作者:IT老高 更新时间:2023-10-28 13:17:56 24 4
gpt4 key购买 nike

我目前正在摆弄 Android 编程,但是我在检测不同的触摸事件时遇到了一个小问题,即正常的触摸按下(按下屏幕并立即释放)、长按(触摸屏幕并按住手指放在上面)和 move (在屏幕上拖动)。

我想做的是在我的屏幕上显示一个(圆形的)图像,我可以拖动它。然后,当我按一次(短按/正常按)时,Toast 会提供一些有关它的基本信息。当我长按它时,会出现一个带有列表的 AlertDialog 以选择不同的图像(圆形、矩形或三角形)。

我用自己的 OnTouchListener 制作了一个自定义 View 来检测事件并在 onDraw 中绘制图像。 OnTouchListener.onTouch 是这样的:

// has a touch press started?
private boolean touchStarted = false;
// co-ordinates of image
private int x, y;

public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
touchStarted = true;
}
else if (action == MotionEvent.ACTION_MOVE) {
// movement: cancel the touch press
touchStarted = false;

x = event.getX();
y = event.getY();

invalidate(); // request draw
}
else if (action == MotionEvent.ACTION_UP) {
if (touchStarted) {
// touch press complete, show toast
Toast.makeText(v.getContext(), "Coords: " + x + ", " + y, 1000).show();
}
}

return true;
}

问题是按下并没有像预期的那样工作,因为当我随意触摸屏幕时,它也会检测到一点点 move 并取消触摸按下并改为在图像周围 move 。

我“破解”了这一点,我引入了一个新变量“mTouchDelay”,我在 ACTION_DOWN 上将其设置为 0,增加 MOVE,如果它在 MOVE 中 >= 3,我执行我的“move ”代码。但我有一种感觉,这不是真正要走的路。

我还没有发现如何检测长按。罪魁祸首确实是似乎总是触发的 MOVE。

有关我大致想要的示例,请参阅 Android 应用程序“DailyStrip”:它显示漫画的图像。如果屏幕太大,您可以拖动它。您可以点击一次以弹出某些控件,然后长按它以打开选项菜单。

PS。我正在尝试让它在 Android 1.5 上运行,因为我的手机只能在 1.5 上运行。

最佳答案

此代码可以区分单击和 move (拖动、滚动)。在onTouchEvent 中设置一个标志isOnClick,并将初始X、Y 坐标放在ACTION_DOWN 上。清除 ACTION_MOVE 上的标志(注意经常会检测到意外 move ,这可以通过 THRESHOLD const 解决)。

private float mDownX;
private float mDownY;
private final float SCROLL_THRESHOLD = 10;
private boolean isOnClick;

@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mDownX = ev.getX();
mDownY = ev.getY();
isOnClick = true;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (isOnClick) {
Log.i(LOG_TAG, "onClick ");
//TODO onClick code
}
break;
case MotionEvent.ACTION_MOVE:
if (isOnClick && (Math.abs(mDownX - ev.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - ev.getY()) > SCROLL_THRESHOLD)) {
Log.i(LOG_TAG, "movement detected");
isOnClick = false;
}
break;
default:
break;
}
return true;
}

对于上面建议的 LongPress,GestureDetector 是可行的方法。检查此问答:

Detecting a long press with Android

关于java - 检测触摸按压与长按与 move ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4324362/

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