Обработка сенсорных событий-onInterceptTouchEvent и onTouchEvent
я хочу иметь возможность проводить в любом месте экрана, чтобы вызвать определенную функцию. Но у меня тоже есть Buttons
на Linear Layouts
что я хочу иметь возможность нажать на. Если я проведу по Button
Я хочу onInterceptTouchEvent
до Intercept
вызов Button
' s onTouchEvent
и выполните действие салфетки. И если я просто нажму на Button
Я не хочу onInterceptTouchEvent
называться. Скорее, я хочу Button
' s onTouchEvent
для вызова и выполнения Button click
но я получаю ошибки при попытке реализации onInterceptTouchEvent
.
вот мой код:
public class Game extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game_activity);
//other code....
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
swipeScreen(); //if action recognized as swipe then swipe
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
float xDelta = Math.abs(x - mLastX);
float yDelta = Math.abs(y - mLastY);
if (yDelta > xDelta) {
return true;
}
break;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
ButtonOnClick(); //if not a swipe, then button click
return true;
}
первая ошибка говорит: The method onInterceptTouchEvent(MotionEvent) of type Game must override or implement a supertype method
вместо return true
изменить код:return super.onInterceptTouchEvent(event)
но затем я получаю сообщение об ошибке сказав: The method onInterceptTouchEvent(MotionEvent) is undefined for the type Activity
может кто-нибудь помочь?
1 ответов
отметим, что onInterceptTouchEvent()
метод с ViewGroup
класса, а не с Activity
.
вы можете достичь желаемого поведения, перемещая свою логику из onInterceptTouchEvent()
to dispatchTouchEvent(MotionEvent ev)
. Не забудьте вызвать реализацию суперкласса dispatchTouchEvent(MotionEvent ev)
для обработки событий, которые должны обрабатываться нормально.
также обратите внимание, что вы должны рассматривать движение как салфетки только тогда, когда Дельта больше, чем константа системы для касания помои!--11-->. И я предлагаю убедиться, что пользователь проводит в нужном направлении, тестируя yDelta / 2 > xDelta
вместо yDelta > xDelta
.
public class Game extends Activity {
private int mSlop;
private float mDownX;
private float mDownY;
private boolean mSwiping;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game_activity);
ViewConfiguration vc = ViewConfiguration.get(this)
mSlop = vc.getScaledTouchSlop();
//other code....
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = ev.getX();
mDownY = ev.getY();
mSwiping = false;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if(mSwiping) {
swipeScreen(); //if action recognized as swipe then swipe
}
break;
case MotionEvent.ACTION_MOVE:
float x = ev.getX();
float y = ev.getY();
float xDelta = Math.abs(x - mDownX);
float yDelta = Math.abs(y - mDownY);
if (yDelta > mSlop && yDelta / 2 > xDelta) {
mSwiping = true;
return true;
}
break;
}
return super.dispatchTouchEvent(ev);
}
}