Урок 102. Touch – обработка касания
Урок 102. Touch – обработка касания
В этом уроке:
- обрабатываем касание
Click here to read this article!
- обрабатываем касание
Click here to read this article!
Последний раз редактировалось damager82 23 май 2017, 22:04, всего редактировалось 6 раз.
Re: Урок 102. Touch – обработка касания
На GridView вешаю обработчик OnTouchListener
В обработчике у меня есть метод OnToch, так вот я никак не могу разобраться, как мне в нем прописать, чтоб он отлавливал слайдинг вправо/влево, а если слайдинг вверх/вниз или просто касание, то пропускал эти действия мимо и не блокировал их.
Может есть к кого примеры?
Код: Выделить всё
mGridView.setOnTouchListener(new GridOnTouchListener());
Может есть к кого примеры?
Re: Урок 102. Touch – обработка касания
Запоминай координату x0 при первом нажатии. y игнорируй.
При движении вычисляй x-x0 - сдвиг относительно начального положения.
Пока Math.abs(x-x0) < delta игнорируй - это просто касание.
При движении вычисляй x-x0 - сдвиг относительно начального положения.
Пока Math.abs(x-x0) < delta игнорируй - это просто касание.
Re: Урок 102. Touch – обработка касания
Пробовал реализовать данную логику, но не получилось нормального результата, в результате все отдал на откуп ViewPagermath64 писал(а):Запоминай координату x0 при первом нажатии. y игнорируй.
При движении вычисляй x-x0 - сдвиг относительно начального положения.
Пока Math.abs(x-x0) < delta игнорируй - это просто касание.
- sergeyotro
- Сообщения: 1
- Зарегистрирован: 26 сен 2012, 22:20
Re: Урок 102. Touch – обработка касания
Хочу внести уточнение. ACTION_CANCEL вызывается в том случае, если коснуться touchable view и после, не прекращая касание, сдвинуть палец с этого view. Например, нажать на кнопку, и после, не отпуская, сместиться вбок от этой кнопки.
Re: Урок 102. Touch – обработка касания
Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?
Re: Урок 102. Touch – обработка касания
попробуйте в проперти вью элемента внести:darkchaos писал(а):Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?
Код: Выделить всё
android:onClick="onClick"
android:clickable="true"
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 102. Touch – обработка касания
Нет, это не помогло. Да к тому же, это не решает проблемы, т.к. надо обрабатывать не только клик, но еще OnItemSelected для ListViewrezak90 писал(а):попробуйте в проперти вью элемента внести:darkchaos писал(а):Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?Код: Выделить всё
android:onClick="onClick" android:clickable="true"
Re: Урок 102. Touch – обработка касания
Если два или более обработчика используют одно и тоже событие, то нужно чтобы обработчики возвращали false, тогда событие будет передано дальше по очереди другим обработчикам.
Еще желательно не блокировать UI длительными операциями в обработчиках и выполнять такие операции в отдельных потоках.
Еще желательно не блокировать UI длительными операциями в обработчиках и выполнять такие операции в отдельных потоках.
Re: Урок 102. Touch – обработка касания
Спасибо, подсказка помогла. А с потоком я согласен, буду разбирать как это делаетсяAndreyI писал(а):Если два или более обработчика используют одно и тоже событие, то нужно чтобы обработчики возвращали false, тогда событие будет передано дальше по очереди другим обработчикам.
Еще желательно не блокировать UI длительными операциями в обработчиках и выполнять такие операции в отдельных потоках.
Re: Урок 102. Touch – обработка касания
Доброго времени суток. Спасибо, за урок. У вас там в уроке активити выступает в роли слушателя? А как сделать, что сам 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 – обработка касания
Слушатели (поддерживаемые View) можно вешать на что угодно, но события передаются последовательно по уровню вложенности, т.е. если кнопка расположена внутри layout то она первая и примет событие, тот кто его обработает (вернет true из обработчика) на том цепочка прервется, кнопка в данном случае поглотит событие потому как onClick формируется из событий onTouch и он всегда возвращает true (во внутренней реализации кнопки) поэтому дальше это событие передаваться не будет и layout его уже не получит. Чтобы событие передавалась в layout при нажатии на встроенную в него кнопку, то можно сделать кнопку некликабельной, либо в обработчике onClick формировать event onTouch и отправлять его.
Если сделать кнопку некликабельной, то можно повесить на нее слушателя onTouch и возвращать false. Тогда событие будет передаваться дальше по иерархии т.е. layout его получит. В этом случае мы сможем обрабатывать события onTouch как в кнопке так и в Layout
Только смысл всего этого?
Если сделать кнопку некликабельной, то можно повесить на нее слушателя onTouch и возвращать false. Тогда событие будет передаваться дальше по иерархии т.е. layout его получит. В этом случае мы сможем обрабатывать события onTouch как в кнопке так и в Layout
Только смысл всего этого?
Re: Урок 102. Touch – обработка касания
Я может не правильно вопрос задал. Может тогда подскажете как сделать, чтоб в textView передавать координаты касания при моей разметке? А как это сделать не в onCreateAndreyI писал(а): Только смысл всего этого?
Или повесить OnTouchListener на textView ?
Re: Урок 102. Touch – обработка касания
вешаете OnTouchListener на кнопку или где вы там хотите отлавливать касание, в обработчике уже присваиваете своему textView полученные координаты
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 102. Touch – обработка касания
Что-то я недопонимаю. Я хочу отлавливать касания на всём верхнем слое, но координаты вписывать в textView. На что тогда вешать OnTouchListener? Я так понял если его повесить на кнопку, то будет срабатывать только касание на кнопку.rezak90 писал(а):вешаете OnTouchListener на кнопку или где вы там хотите отлавливать касание, в обработчике уже присваиваете своему textView полученные координаты
Re: Урок 102. Touch – обработка касания
да, если нужно на какой то слой то устанавливайте на него, в чём проблема? если linearlayout то на него вешайте OnTouchListenerЯ так понял если его повесить на кнопку, то будет срабатывать только касание на кнопку.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 102. Touch – обработка касания
Всё, разобрался. Спасибоrezak90 писал(а):в чём проблема? если linearlayout то на него вешайте OnTouchListener
Re: Урок 102. Touch – обработка касания
Экспериментировала со свайпами - "движение направо". Вот так обработчик выглядит и его параметры
У меня на активити листвью почти во весь экран - повесила обработчик на него.
Вообще не понравилась реакция, срабатывает через два на третий, долго перебирала константы настроек, проводила быстрее или медленнее.. все равно фигня получается.
Что-то явно не так делаю, ведь прокрутка списка сверху вниз прекрасно работает..
Код: Выделить всё
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
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 102. Touch – обработка касания
Люди, это нормально, что у меня ну никак не получается сделать так, чтобы только MotionEvent.ACTION_DOWN событие было. Обязательно каждый раз еще и движение добавляется. ?)
Re: Урок 102. Touch – обработка касания
по MotionEvent.ACTION_DOWN делай return true, всем остальным return false;
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена