gpt4 book ai didi

android - 处理触摸事件 - onInterceptTouchEvent 和 onTouchEvent

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:34:28 27 4
gpt4 key购买 nike

我希望能够在屏幕上的任意位置滑动来调用某个函数。但我在 Linear Layouts 中也有 Buttons,我希望能够点击它们。如果我在 Button 上滑动,我希望 onInterceptTouchEvent Intercept 调用 ButtononTouchEvent 并执行滑动操作。如果我只是点击一个 Button,我不想调用 onInterceptTouchEvent。相反,我希望调用 ButtononTouchEvent 并执行 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;
}

首先错误说:Game 类型的方法 onInterceptTouchEvent(MotionEvent) 必须覆盖或实现父类(super class)型方法

然后我将代码更改为:return super.onInterceptTouchEvent(event) 而不是 return true 但随后我收到一条错误消息:The method onInterceptTouchEvent( MotionEvent)对于类型 Activity 是未定义的

有人可以帮忙吗?

最佳答案

请注意 onInterceptTouchEvent()ViewGroup 类的方法,而不是 Activity 的方法。

您可以通过将逻辑从 onInterceptTouchEvent() 移动到 dispatchTouchEvent(MotionEvent ev) 来实现所需的行为.记得调用dispatchTouchEvent(MotionEvent ev)的父类(super class)实现来处理应该正常处理的事件。

另请注意,只有当增量大于 system constant for touch slop 时,您才应将移动视为滑动。 .我建议通过测试 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);
}
}

关于android - 处理触摸事件 - onInterceptTouchEvent 和 onTouchEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27406072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com