Страница 1 из 3

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

Добавлено: 12 авг 2012, 23:00
damager82
В этом уроке:
- обрабатываем касание


Click here to read this article!

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

Добавлено: 20 авг 2012, 18:50
neoksi
На GridView вешаю обработчик OnTouchListener

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

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

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

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

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

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

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

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

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

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

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

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

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

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

android:onClick="onClick"
android:clickable="true"

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

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

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

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

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

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

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

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

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

Добавлено: 23 ноя 2012, 11:35
Digetix
Доброго времени суток. Спасибо, за урок. У вас там в уроке активити выступает в роли слушателя? А как сделать, что сам 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>

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

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

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

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

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

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

Добавлено: 23 ноя 2012, 13:46
rezak90
вешаете OnTouchListener на кнопку или где вы там хотите отлавливать касание, в обработчике уже присваиваете своему textView полученные координаты

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

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

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

Добавлено: 23 ноя 2012, 14:18
rezak90
Я так понял если его повесить на кнопку, то будет срабатывать только касание на кнопку.
да, если нужно на какой то слой то устанавливайте на него, в чём проблема? если linearlayout то на него вешайте OnTouchListener

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

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

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

Добавлено: 29 апр 2013, 12:25
Foenix
Экспериментировала со свайпами - "движение направо". Вот так обработчик выглядит и его параметры

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

		
		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");
		
	}

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

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

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

Добавлено: 15 май 2013, 13:46
rezak90
по MotionEvent.ACTION_DOWN делай return true, всем остальным return false;