0

我有一个CustomCanvasView扩展类View,并且我已经为该类实现了单击、拖动和捏缩放。现在我想实现长点击。

从我在各种帖子中读到的内容来看,每个人都有不同的做法,但普遍的共识似乎是我应该使用 anOnLongClickListener或 a GestureDetector。但是,我需要长按的确切坐标,而且我担心这些方法可能无法很好地与我在我的onTouch()方法中工作的内容配合使用。

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

更新

所以,我决定通过设置我的startTime = System.nanoTime();事件来手动测量时间,然后找到ACTION_DOWNonTouch(...)

 estimatedTime = System.nanoTime() - startTime;
 seconds = (double) estimatedTime / 1000000000.0;

在这种ACTION_UP情况下,并测试该值是否超过 1。这很有效,所以我想添加触觉反馈。

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

在我使用过的应用程序中,当你的手指向下时,触觉反馈会很好地发生,这样你就可以知道你已经过了长按的时间阈值在你抬起手指之前告诉你已经超过了长按的时间阈值。有没有办法在不修改我的应用程序的整个逻辑的情况下在这里发生这种情况?即,我可以在内部课程中振动电话吗?

更新

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

我没有在 的情况下检查 的值,而是estimatedTime在这种ACTION_UP情况下设置了一个等于的onTouch(...)布尔值,然后在开始时仅检查计时器是否已启动,如果是,则检查 的值。如果它超过了我的阈值,那么我告诉相关的活动提供触觉反馈。我也设置了,所以我有这个信息在案例中。timerStartedtrueACTION_DOWNonTouch(...)estimatedTimemode = LONG_CLICKACTION_UP

你只需要确保你设置timerStarted = false在所有正确的位置进行了设置(即,如果您确定事件是缩放事件、拖动事件或单击事件)并且您应该很好。

谢谢!

4

1 回答 1

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();
}
于 2013-07-20T10:13:30.077 回答