Долгое Касание к surfaceView (android)

Я делаю игру на Android, и я должен сделать определенные действия, когда пользователи делают попытку длинного нажатия на экране. К сожалению, я не нашел методов, который работает непосредственно с пользовательским SurfaceView, не стесняйтесь говорить мне, если такой метод существует :)

Таким образом, я решил попытаться реализовать долгое сенсорное обнаружение от onTouch слушателя события.

вот мой код:

@Override
    public boolean onTouch(View v, MotionEvent event)
    {
        long touchDuration = 0;


            if ( event.getAction() == MotionEvent.ACTION_DOWN )
            {
                //Start timer
                touchTime = System.currentTimeMillis();


            }else if ( event.getAction() == MotionEvent.ACTION_UP )
            {
                //stop timer
                touchDuration = System.currentTimeMillis() - touchTime;

                if ( touchDuration < 800 )
                {
                    onShortTouch(event,touchDuration);
                }else
                {
                    onLongTouch(event,touchDuration);
                }
            }
        }

        return true;

Это работает, но я могу обнаружить, если нажатие было длинным нажатием или не только когда пользователь прекращает касаться телефона. Таким образом, это не точно, что я хочу. Я предпочел бы, если таймер запустится, когда пользователь сначала коснется экрана затем, после того как 800 мс истекают LongTouch (), метод называют. Другими словами, я не хочу должным быть проверять, сколько времени протек когда ACTION_UP начиная с ACTION_DOWN. Я полагаю, что должен использовать поток для упомянутого таймера, но я не могу заставить его работать. При использовании следующего кода отображено сообщение отладки, как только я касаюсь экрана:

        @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        long touchDuration = 0;

            TouchThread touchThread = new TouchThread();

            if ( event.getAction() == MotionEvent.ACTION_DOWN )
            {
                //Start timer
                touchTime = System.currentTimeMillis();
                touchThread.setEvent(event);
                touchThread.run();  
            }

        return true;
    }


    private class TouchThread extends Thread
    {

            public MotionEvent event = null;

            public void setEvent(MotionEvent e)
            {
                event = e;
            }

            @Override
            public void run()
            {
                long startTime = System.currentTimeMillis();
                long time = 0;

                while(event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    time = System.currentTimeMillis() - startTime;
                    if( time > 800 )
                    {
                        System.out.println("LOOONG CLICK!!");
                        return;
                    }
                }
            }
    }

Кто-либо получил какую-либо идею? Другое решение также приветствовалось бы.

Спасибо.

7
задан Mr Lister 30 April 2012 в 08:31
поделиться