- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我目前正在摆弄 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 是可行的方法。检查此问答:
关于java - 检测触摸按压与长按与 move ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4324362/
我是一名优秀的程序员,十分优秀!