Урок 102. Touch – обработка касания
Добавлено: 12 авг 2012, 23:00
В этом уроке:
- обрабатываем касание
Click here to read this article!
- обрабатываем касание
Click here to read this article!
Добро пожаловать на форум сайта
http://forum.startandroid.ru/
Код: Выделить всё
mGridView.setOnTouchListener(new GridOnTouchListener());
Пробовал реализовать данную логику, но не получилось нормального результата, в результате все отдал на откуп ViewPagermath64 писал(а):Запоминай координату x0 при первом нажатии. y игнорируй.
При движении вычисляй x-x0 - сдвиг относительно начального положения.
Пока Math.abs(x-x0) < delta игнорируй - это просто касание.
попробуйте в проперти вью элемента внести:darkchaos писал(а):Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?
Код: Выделить всё
android:onClick="onClick"
android:clickable="true"
Нет, это не помогло. Да к тому же, это не решает проблемы, т.к. надо обрабатывать не только клик, но еще OnItemSelected для ListViewrezak90 писал(а):попробуйте в проперти вью элемента внести:darkchaos писал(а):Добрый день. Я использую обработку события onTouch, но в результате у меня блокируются другие события для этого view компонента. Что нужно сделать чтобы можно было обрабатывать не только touch события, но и другие?Код: Выделить всё
android:onClick="onClick" android:clickable="true"
Спасибо, подсказка помогла. А с потоком я согласен, буду разбирать как это делаетсяAndreyI писал(а):Если два или более обработчика используют одно и тоже событие, то нужно чтобы обработчики возвращали false, тогда событие будет передано дальше по очереди другим обработчикам.
Еще желательно не блокировать UI длительными операциями в обработчиках и выполнять такие операции в отдельных потоках.
Код: Выделить всё
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>
Я может не правильно вопрос задал. Может тогда подскажете как сделать, чтоб в textView передавать координаты касания при моей разметке? А как это сделать не в onCreateAndreyI писал(а): Только смысл всего этого?
Что-то я недопонимаю. Я хочу отлавливать касания на всём верхнем слое, но координаты вписывать в textView. На что тогда вешать OnTouchListener? Я так понял если его повесить на кнопку, то будет срабатывать только касание на кнопку.rezak90 писал(а):вешаете OnTouchListener на кнопку или где вы там хотите отлавливать касание, в обработчике уже присваиваете своему textView полученные координаты
да, если нужно на какой то слой то устанавливайте на него, в чём проблема? если linearlayout то на него вешайте OnTouchListenerЯ так понял если его повесить на кнопку, то будет срабатывать только касание на кнопку.
Всё, разобрался. Спасибоrezak90 писал(а):в чём проблема? если linearlayout то на него вешайте OnTouchListener
Код: Выделить всё
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");
}