Android onClick блокировка на Fling
У меня есть действие, которое реализует детектор жестов, чтобы поймать пользовательский ввод данных для перехода к другим экранам. Это работало нормально - но - я недавно обновил класс, производный от BaseActivity, чтобы добавить функцию onClick, и теперь это событие click, кажется, блокирует попадание onFling. OnClick привязан к области TextView (в LinearLayout) у меня на экране. Метод resultsClick связан с TextView, используя его свойство onClick в макете XML.
Я попытался изменить возвращаемые значения в onSingleTapUp и onDown без удачи. Я также попытался добавить операторы журнала ко всем функциям ниже. Ни один из них не срабатывает, когда я переключаюсь в область TextView, но они работают в других областях экрана.
Возможно, я использую неправильные условия поиска, но мне не удалось найти пример, который решает эту проблему, - но я уверен, что эта проблема была решена раньше.
public class DerivedActivity extends BaseActivity
{
...
/**
* resultsClick - The user clicked on the Results area
* @param v
*/
public void resultsClick(View v)
{
try
{
Log.i(this.toString(), "resultsClick");
startActivity(new Intent(this, Results_TabHost.class ));
}
catch (Exception e)
{
Log.e(this.toString(), "Exception" + e.toString());
}
}// end resultsClick
...
}
Вот базовый класс, который реализует код GestureListener
public class BaseActivity extends ActivityGroup
implements OnGestureListener
{
...
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
public boolean onFling(MotionEvent e1,
MotionEvent e2,
float velocityX,
float velocityY)
{
try
{
Log.i(this.toString(), "onFling");
// jump right out if not a swipe/fling
if (Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH)
{
return false;
}
// right to left swipe
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY )
{
Log.i(this.toString(), "fling left");
rightArrowClick(null);
}
else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY )
{
Log.i(this.toString(), "fling right");
leftArrowClick(null);
}
}
catch (Exception e)
{
Log.e(this.toString(), "Exception" + e.toString());
}
return true;
}// end onFling
// These next methods we are required to have - even if unused -
// in order for the Gesture Handling to work
@Override
public boolean onTouchEvent(MotionEvent motionEvent)
{
return this.gestureDetector.onTouchEvent(motionEvent);
}
@Override
public void onLongPress(MotionEvent e)
{
// Intentionally not handling - must be overridden by listener class
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
// Intentionally not handling - must be overridden by listener class
// Intentionally returning true - per code examples
return true;
}
@Override
public void onShowPress(MotionEvent e)
{
// Intentionally not handling - must be overridden by listener class
}
@Override
public boolean onSingleTapUp(MotionEvent e)
{
// Intentionally not handling - must be overridden by listener class
// Intentionally returning true - per code examples
return true;
}
@Override
public boolean onDown(MotionEvent e)
{
// Intentionally not handling - must be overridden by listener class
// Intentionally returning true - per code examples
return true;
}
...
}
4 ответа
Пожалуйста, обратите внимание на эту функцию:
@Override
public boolean onDown(MotionEvent e)
{
// Intentionally not handling - must be overridden by listener class
// Intentionally returning true - per code examples
return true;
}
Пожалуйста, измените возвращаемое значение на false.
Ваша реализация onTouchEvent неверна. Вы просто возвращаете значение результата gestDector.
Однако если ваш детектор жестов не обнаруживает никаких жестов, вы говорите звонящему: "Мне здесь нечего было делать", и событие касания никогда не будет отправлено дочерним элементам Действия.
Вам нужно позвонить super.onTouchEvent()
если ваш детектор жестов не обработал событие.
@Override
public boolean onTouchEvent(MotionEvent motionEvent)
{
if(this.gestureDetector.onTouchEvent(motionEvent))
{
return true;
}
//no gesture detected, let Activity handle touch event
return super.onTouchEvent(motionEvent);
}
Вы можете просто вернуть false, если ваш код ничего не делает... Это позволит системе событий движения управлять всем самостоятельно. Верните true, если хотите остановить событие, которое будет отправлено в представление других детей.
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mDetector.onTouchEvent(event)) {
return true;
}
return HomeScreen.super.onTouchEvent(event);
}
});
public class JGestureDetector extends GestureDetector.SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private SwipeHandler handler;
public SwipeHandler getHandler() {
return handler;
}
public void setHandler(SwipeHandler handler) {
this.handler = handler;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// left
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (handler != null) {
handler.onLeft();
return true;
}
// right
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (handler != null) {
handler.onRight();
return true;
}
}
return super.onFling(e1, e2, velocityX, velocityY);
}
public static abstract class SwipeHandler {
public void onLeft() {
}
public void onRight() {
}
}
}