2012-07-03 3 views
3

Меня попросили изменить существующий код как часть онлайн-курса. В настоящее время приложение регистрирует и отображает координаты x и y позиции, в которой коснулся экран, а также количество времени в миллисекундах.Как получить начальную и конечную координаты на событии Android Touch (событие движения)?

Я хочу добавить функцию получения как начальной, так и конечной координат, где начинается палец, и где он заканчивается при перетаскивании. В настоящий момент зарегистрированные координаты кажутся только конечными. Как добавить оба набора координат (например, если я хочу рассчитать расстояние события движения)? Вот часть кода. Спасибо за помощь!

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    Calendar tiempoInicio = null; 
    Calendar tiempoFinal = null; 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     int x = (int)event.getX(); 
     int y = (int)event.getY(); 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
       tiempoInicio = Calendar.getInstance(); 
       break; 
     case MotionEvent.ACTION_MOVE: 
      break; 
     case MotionEvent.ACTION_UP: 
       tiempoFinal = Calendar.getInstance(); 


       Intent intent = new Intent (
            AplicacionSencillaActivity.this, 
           AplicacionSencillaResults.class); 
       Bundle bundle = new Bundle(); 
       bundle.putLong(
           "TIEMPOPRESIONADO", 
           tiempoFinal.getTimeInMillis() - 
           tiempoInicio.getTimeInMillis()); 
       bundle.putInt("X", x); 
       bundle.putInt("Y", y); 

       intent.putExtras(bundle); 
       startActivity(intent); 
       break; 

ответ

0

Чтобы получить начальные координаты, вам нужно получить и сохранить getX() и getY() во время ACTION_DOWN случае также, поскольку это означает начало движения.

0

На самом деле ваш код в основном правильный, ACTION_DOWN даст вам начало, ACTION_UP - конец. Ваша ошибка переопределяет onTouchEvent() - прочитайте описание, он говорит, что он будет вызываться только в том случае, если ни одно из представлений не коснулось касания, так что ваше прикосновение может быть перехвачено некоторыми вашими представлениями вашего ребенка.

Заменяет dispatchTouchEvent(), и вы получите все касания. Не забудьте позвонить по телефону super.dispatchTouchEvent(), или вы не сможете дотрагиваться до того, как будете доставляться к просмотру в своей деятельности.

+0

Спасибо, Иван! Однако приложение все еще регистрирует только последние координаты. Нужно ли мне getX и getY во время ACTION_DOWN, как говорит Geobits ниже? Если да, то где именно я должен поставить код? –

+0

Да, я предположил, что это то, что вы уже делаете :) Как это работает, вы получаете все события, которые дает вам экран, и ваша работа заключается в том, чтобы выяснить, что происходит. Я бы использовал элемент для хранения состояния. Как 'boolean mIsSwiping'. Когда вы получаете 'ACTION_DOWN', установите его в' true' и прочитайте координаты начальной точки. Когда вы получаете 'ACTION_UP': если' mIsSwiping' является 'истинным', тогда прочитайте завершающие координаты и установите' mIsSwiping' в 'false', если нет - ничего не делать. –

+0

Отметьте это для справки: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/widget/ScrollView.java#483 Обратите внимание, как для 'ACTION_DOWN' они в основном устанавливают' mIsBeingDragged' (в зависимости от количества детей, но это потому, что это 'ScrollView', вы не можете прокручивать, если у него есть дочерний элемент) до' true' и для 'ACTION_U'P или' ACTION_CANCEL' они установите 'mIsBeingDragged' значение false –

Смежные вопросы