Урок 102. Touch – обработка касания

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 102. Touch – обработка касания

Сообщение damager82 » 12 авг 2012, 23:00

В этом уроке:
- обрабатываем касание


Click here to read this article!
Последний раз редактировалось damager82 23 май 2017, 22:04, всего редактировалось 6 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 102. Touch – обработка касания

Сообщение neoksi » 20 авг 2012, 18:50

На GridView вешаю обработчик OnTouchListener

Код: Выделить всё

mGridView.setOnTouchListener(new GridOnTouchListener());
В обработчике у меня есть метод OnToch, так вот я никак не могу разобраться, как мне в нем прописать, чтоб он отлавливал слайдинг вправо/влево, а если слайдинг вверх/вниз или просто касание, то пропускал эти действия мимо и не блокировал их.

Может есть к кого примеры?

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 102. Touch – обработка касания

Сообщение math64 » 21 авг 2012, 08:10

Запоминай координату x0 при первом нажатии. y игнорируй.
При движении вычисляй x-x0 - сдвиг относительно начального положения.
Пока Math.abs(x-x0) < delta игнорируй - это просто касание.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 102. Touch – обработка касания

Сообщение neoksi » 22 авг 2012, 13:15

math64 писал(а):Запоминай координату x0 при первом нажатии. y игнорируй.
При движении вычисляй x-x0 - сдвиг относительно начального положения.
Пока Math.abs(x-x0) < delta игнорируй - это просто касание.
Пробовал реализовать данную логику, но не получилось нормального результата, в результате все отдал на откуп ViewPager ;)

Аватара пользователя
sergeyotro
Сообщения: 1
Зарегистрирован: 26 сен 2012, 22:20

Re: Урок 102. Touch – обработка касания

Сообщение sergeyotro » 26 сен 2012, 22:24

Хочу внести уточнение. ACTION_CANCEL вызывается в том случае, если коснуться touchable view и после, не прекращая касание, сдвинуть палец с этого view. Например, нажать на кнопку, и после, не отпуская, сместиться вбок от этой кнопки.

darkchaos
Сообщения: 7
Зарегистрирован: 05 окт 2012, 09:27

Re: Урок 102. Touch – обработка касания

Сообщение darkchaos » 05 окт 2012, 09:30

Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 102. Touch – обработка касания

Сообщение rezak90 » 05 окт 2012, 09:54

darkchaos писал(а):Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?
попробуйте в проперти вью элемента внести:

Код: Выделить всё

android:onClick="onClick"
android:clickable="true"
R.id.team
Политика на форуме запрещена

darkchaos
Сообщения: 7
Зарегистрирован: 05 окт 2012, 09:27

Re: Урок 102. Touch – обработка касания

Сообщение darkchaos » 05 окт 2012, 10:42

rezak90 писал(а):
darkchaos писал(а):Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?
попробуйте в проперти вью элемента внести:

Код: Выделить всё

android:onClick="onClick"
android:clickable="true"
Нет, это не помогло. Да к тому же, это не решает проблемы, т.к. надо обрабатывать не только клик, но еще OnItemSelected для ListView

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 102. Touch – обработка касания

Сообщение AndreyI » 05 окт 2012, 11:09

Если два или более обработчика используют одно и тоже событие, то нужно чтобы обработчики возвращали false, тогда событие будет передано дальше по очереди другим обработчикам.
Еще желательно не блокировать UI длительными операциями в обработчиках и выполнять такие операции в отдельных потоках.

darkchaos
Сообщения: 7
Зарегистрирован: 05 окт 2012, 09:27

Re: Урок 102. Touch – обработка касания

Сообщение darkchaos » 05 окт 2012, 15:24

AndreyI писал(а):Если два или более обработчика используют одно и тоже событие, то нужно чтобы обработчики возвращали false, тогда событие будет передано дальше по очереди другим обработчикам.
Еще желательно не блокировать UI длительными операциями в обработчиках и выполнять такие операции в отдельных потоках.
Спасибо, подсказка помогла. А с потоком я согласен, буду разбирать как это делается

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 102. Touch – обработка касания

Сообщение Digetix » 23 ноя 2012, 11:35

Доброго времени суток. Спасибо, за урок. У вас там в уроке активити выступает в роли слушателя? А как сделать, что сам layout выступал в роли слушателя? То есть активити, на нём два слоя, один пустой с textView, другой с кнопкой, так вот как сделать чтоб нажимая на верхний layout передавать координаты в textView?

Код: Выделить всё

package com.main;

import android.app.Activity;
import android.os.Bundle;

public class ActivityMain extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
}

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical" >
  <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical" >
  <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal|center"
        android:textColor="@color/cherniy"
        android:textStyle="bold" />
   </LinearLayout>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" >
 <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
   </LinearLayout>
</LinearLayout>
</LinearLayout>

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 102. Touch – обработка касания

Сообщение AndreyI » 23 ноя 2012, 12:07

Слушатели (поддерживаемые View) можно вешать на что угодно, но события передаются последовательно по уровню вложенности, т.е. если кнопка расположена внутри layout то она первая и примет событие, тот кто его обработает (вернет true из обработчика) на том цепочка прервется, кнопка в данном случае поглотит событие потому как onClick формируется из событий onTouch и он всегда возвращает true (во внутренней реализации кнопки) поэтому дальше это событие передаваться не будет и layout его уже не получит. Чтобы событие передавалась в layout при нажатии на встроенную в него кнопку, то можно сделать кнопку некликабельной, либо в обработчике onClick формировать event onTouch и отправлять его.
Если сделать кнопку некликабельной, то можно повесить на нее слушателя onTouch и возвращать false. Тогда событие будет передаваться дальше по иерархии т.е. layout его получит. В этом случае мы сможем обрабатывать события onTouch как в кнопке так и в Layout
Только смысл всего этого?

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 102. Touch – обработка касания

Сообщение Digetix » 23 ноя 2012, 12:26

AndreyI писал(а): Только смысл всего этого?
Я может не правильно вопрос задал. Может тогда подскажете как сделать, чтоб в textView передавать координаты касания при моей разметке? А как это сделать не в onCreate

Или повесить OnTouchListener на textView ?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 102. Touch – обработка касания

Сообщение rezak90 » 23 ноя 2012, 13:46

вешаете OnTouchListener на кнопку или где вы там хотите отлавливать касание, в обработчике уже присваиваете своему textView полученные координаты
R.id.team
Политика на форуме запрещена

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 102. Touch – обработка касания

Сообщение Digetix » 23 ноя 2012, 13:56

rezak90 писал(а):вешаете OnTouchListener на кнопку или где вы там хотите отлавливать касание, в обработчике уже присваиваете своему textView полученные координаты
Что-то я недопонимаю. Я хочу отлавливать касания на всём верхнем слое, но координаты вписывать в textView. На что тогда вешать OnTouchListener? Я так понял если его повесить на кнопку, то будет срабатывать только касание на кнопку.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 102. Touch – обработка касания

Сообщение rezak90 » 23 ноя 2012, 14:18

Я так понял если его повесить на кнопку, то будет срабатывать только касание на кнопку.
да, если нужно на какой то слой то устанавливайте на него, в чём проблема? если linearlayout то на него вешайте OnTouchListener
R.id.team
Политика на форуме запрещена

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 102. Touch – обработка касания

Сообщение Digetix » 23 ноя 2012, 14:20

rezak90 писал(а):
в чём проблема? если linearlayout то на него вешайте OnTouchListener
Всё, разобрался. Спасибо

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 102. Touch – обработка касания

Сообщение Foenix » 29 апр 2013, 12:25

Экспериментировала со свайпами - "движение направо". Вот так обработчик выглядит и его параметры

Код: Выделить всё

		
		private static final int SWIPE_THRESHOLD = 100;
		private static final int SWIPE_VELOCITY_THRESHOLD = 50;

		@Override
		public boolean onFling(MotionEvent start, MotionEvent finish, float xVelocity, float yVelocity){
				 boolean result = false;
				 Log.d("CActivity", "Fling detected");
		         try {
		             float diffY = finish.getY() - start.getY();
		             float diffX = finish.getX() - start.getX();
		             if (Math.abs(diffX) > Math.abs(diffY)) {
		                 if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(xVelocity) > SWIPE_VELOCITY_THRESHOLD) {
		                     if (diffX > 0) {
		                    	 onRightSwipe();
		                     } else {
		                    	 onLeftSwipe();
		                     }
		                 }
		             } else {
		                 if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(xVelocity) > SWIPE_VELOCITY_THRESHOLD) {
		                     if (diffY > 0) {
		                         onSwipeBottom();
		                     } else {
		                         onSwipeTop();
		                     }
		                 }
		             }

			} catch (Exception e) {
				Log.e("YourActivity", "Error on gestures");
			}
			return false;
		}
	}
У меня на активити листвью почти во весь экран - повесила обработчик на него.

Вообще не понравилась реакция, срабатывает через два на третий, долго перебирала константы настроек, проводила быстрее или медленнее.. все равно фигня получается.
Что-то явно не так делаю, ведь прокрутка списка сверху вниз прекрасно работает..

Код: Выделить всё

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (gestureDetector.onTouchEvent(event)) {
			return true;
		}
		return super.onTouchEvent(event);
	}

	private void onLeftSwipe() {
		 Log.d("CActivity", "Fling onLeftSwipe");
	}

	private void onRightSwipe() {
		 Log.d("CActivity", "Fling onRightSwipe");
		//Мое действие
	}
	private void onSwipeBottom() {
		 Log.d("CActivity", "Fling onSwipeBottom");
		
	}
	private void onSwipeTop() {
		 Log.d("CActivity", "Fling onSwipeTop");
		
	}
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Dangreon
Сообщения: 41
Зарегистрирован: 01 янв 2013, 15:52

Re: Урок 102. Touch – обработка касания

Сообщение Dangreon » 15 май 2013, 13:33

Люди, это нормально, что у меня ну никак не получается сделать так, чтобы только MotionEvent.ACTION_DOWN событие было. Обязательно каждый раз еще и движение добавляется. ?)

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 102. Touch – обработка касания

Сообщение rezak90 » 15 май 2013, 13:46

по MotionEvent.ACTION_DOWN делай return true, всем остальным return false;
R.id.team
Политика на форуме запрещена

Ответить