如果需要精确的点击坐标,如何在视图上实现长按?

时间:2013-07-20 02:17:42

标签: android canvas view ontouchevent onlongclicklistener

我有一个CustomCanvasView课程View,我已经为课程实施了点击,拖动和捏缩放。现在我想实现长时间点击。

从我在各个帖子中看到的内容来看,每个人都有different方式这样做,但普遍的共识似乎是我应该使用OnLongClickListener或{{1} }。但是,我需要长按的精确坐标,我担心这些方法可能无法与我在GestureDetector方法中使用的方法很好地协作。

那么哪种方法最适合这些特定需求?

更新

所以,我决定通过在我的onTouch()事件的startTime = System.nanoTime();案例中设置ACTION_DOWN来手动衡量时间,然后找到

onTouch(...)
estimatedTime = System.nanoTime() - startTime; seconds = (double) estimatedTime / 1000000000.0; 案例中

,并测试该值是否超过1.这有效,所以我想添加触觉反馈。

由于所有这些都是在一个类(而不是一个活动)中处理的,所以我决定将关于点击的信息传递给相关的活动,并让它在{1}}的情况下使用ACTION_UP振动设备。长按一下。这也有效,但是,因为直到长按完成后才会传递信息,即振动发生时。

在应用程序中我使用了触觉反馈很好地发生在您的手指向下时,这样您就可以告诉您已经超过了长时间点击的时间阈值,然后抬起手指。有没有办法在没有重新处理我的应用程序的整个逻辑的情况下发生这种情况?即,我可以在内部课堂内振动手机吗?

更新

我想出了如何使触觉反馈比以前更好。它仍然不完美,但这就是我做到的。

而不是检查Vibrator estimatedTime案例ACTION_UPonTouch(...)的值,我在{{1}中设置了一个等于timerStarted的布尔true然后在ACTION_DOWN的开头只检查计时器是否已启动,如果是,则检查onTouch(...)的值。如果它超过我的阈值,那么我告诉相关活动提供触觉反馈。我还设置了estimatedTime,因此我在mode = LONG_CLICK案例中提供了此信息。

您只需要确保在所有正确的位置设置ACTION_UP(例如,如果您确定事件是缩放事件,拖动事件或点击事件),那么您应该很好。

谢谢!

1 个答案:

答案 0 :(得分:1)

对于自定义长触摸检测,您可以使用TimerTask

以下是示例代码

public Timer mTIMERForLongTouch;
Handler mHandler = new Handler(){};
int mTIMEForLongTouch=0;
float longTouchX, longTouchY;

if(event.getAction()==MotionEvent.ACTION_DOWN)
{
// longTouchX & longTouchY is x-y coordinate of long touch
longTouchX = event.getX();
longTouchY = event.getY();
mTIMERForLongTouch = new Timer();
mTIMERForLongTouch.schedule(new TimerTask() {
        @Override
        public void run() {
            mTIMEForLongTouch+= 100;
            if(mTIMEForLongTouch>1500)
            {
                mHandler.post(new Runnable() 
                {
                    public void run() 
                    {
                        Toast.makeText(context, "Long Touch", Toast.LENGTH_SHORT).show();
                        mTIMERForLongTouch.cancel();
                        mTIMEForLongTouch=0;

                    }
                });
            }
        }
    }, 0,100);
}
else if(event.getAction()==MotionEvent.ACTION_UP)
{
    mTIMEForLongTouch=0;
    mTIMERForLongTouch.cancel();
}