Cai*_*ife 13 user-interface android gesture-recognition swipe android-view
我正试图在Android上制作一个Snake游戏,其中蛇用滑动手势移动.
我已经尝试了很多方法来完成这项工作,但它们似乎都不适合我.我没有实现一个视图 - 这会有问题吗?
这是我尝试基于之前的StackOverflow问题实现的示例 - Android:如何处理从右到左的滑动手势.
我按照指示创建了OnSwipeTouchListener.java.然而,我遇到了一些使用问题.
在GameScreen.java(这是所有触摸事件发生的地方)中,我将此作为示例添加 -
onSwipeTouchListener = new OnSwipeTouchListener() {
public void onSwipeTop() {
Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}
public void onSwipeRight() {
Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show();
}
public void onSwipeLeft() {
Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show();
}
public void onSwipeBottom() {
Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
}
};
imageView.setOnTouchListener(onSwipeTouchListener);
Run Code Online (Sandbox Code Playgroud)
这会导致出现一堆错误(主要涉及imageView),并且都无法解析.
有没有人碰巧有一个替代的滑动实现特定于我的情况?
您可以通过两种方式执行此操作:
选项1:
在游戏的基础活动类中:
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
try {
float slope = (e1.getY() - e2.getY()) / (e1.getX() - e2.getX());
float angle = (float) Math.atan(slope);
float angleInDegree = (float) Math.toDegrees(angle);
// left to right
if (e1.getX() - e2.getX() > 20 && Math.abs(velocityX) > 20) {
if ((angleInDegree < 45 && angleInDegree > -45)) {
//code for left to right swipe should go here
}
// right to left fling
} else if (e2.getX() - e1.getX() > 20
&& Math.abs(velocityX) > 20) {
if ((angleInDegree < 45 && angleInDegree > -45)) {
//code for right to left swipe should go here
}
}
return true;
} catch (Exception e) {
// nothing
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以注册任何视图以接收/收听手势:
final GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector());
gameView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) return false;
return false;
}
});
//the parent layout
findViewById(R.id.parent_layout).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) return false;
return false;
}
});
//an image view
findViewById(R.id.image_view).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) return false;
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
选项2:
如果GameScreen类可以直接访问触摸事件,则可以读取它们并实现滑动操作的逻辑.其代码类似于Mostafa Gazar的答案.
如果您有权访问触摸事件,请尝试此操作
int len = touchEvents.size();
Graphics g = game.getGraphics();
for (int i = 0; i < len; i++) {
TouchEvent event = touchEvents.get(i);
if (event.type == TouchEvent.TOUCH_DOWN)
{
x1=event.x;
y1=event.y;
}
if (event.type == TouchEvent.TOUCH_UP)
{
x2=event.x;
y2=event.y;
dx=(x2-x1);
dy=(y2-y1);
tu=1;
}
if((tu==1) && (Math.abs(dx)>Math.abs(dy)))
{
if(dx>0)
{
if(!(robot.getSpeedX()<0))
{
robot.stop();
robot.moveRight();
}
}
else
{
if(!(robot.getSpeedX()>0))
{
robot.stop();
robot.moveLeft();
}
}
tu=0;
}
if((tu==1) && (Math.abs(dx)<=Math.abs(dy)))
{
if(dy>0)
{
if(!(robot.getSpeedY()<0))
{
robot.stop();
robot.moveDown();
}
}
else
{
if(!(robot.getSpeedY()>0))
{
robot.stop();
robot.moveUp();
}
}
tu=0;
}
Run Code Online (Sandbox Code Playgroud)