Как реализовать Swipe в игре для Андроид без просмотра

Я пытаюсь сделать змею игру на Android, в которой змея движется с жестами салфетки.

Я пробовал много способов сделать это, но ни один из них не похоже на работу для меня. Я не реализовал представление-это будет проблемой?

Это пример, который я попытался реализовать на основе предыдущего вопроса 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);

Это вызывает кучу ошибок (в основном с участием imageView), и ни одна из них не может быть решена.

у кого-нибудь есть альтернативная реализация салфетки, специфичная для моего случая?

4 ответов


Если у вас есть доступ к сенсорным событиям, попробуйте это

    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;
        }

Вы можете сделать это двумя способами:

Вариант 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;
        }
    }

затем вы можете зарегистрировать любой вид для получения / прослушивания жестов:

 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;
                    }
                });

Вариант 2:

Если класс GameScreen напрямую имеет доступ к сенсорным событиям, вы можете прочитать их и реализовать логику действий салфетки. Код, подобный Ответ Мустафы газара.


вы должны опубликовать свой GameScreen как Нана Гарти

если у вас есть доступ к сенсорным данным, Вы можете сделать что-то вроде следующего

private static final int DEFAULT_THRESHOLD = 36;// Better to be something in dps.

... = new View.OnTouchListener() {

    int initialX = 0;
    int initialY = 0;
    final float slop = ViewConfiguration.get(context).getScaledTouchSlop();

    public boolean onTouch(final View view, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            initialX = (int) event.getX();
            initialY = (int) event.getY();
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            int currentX = (int) event.getX();
            int currentY = (int) event.getY();
            int offsetX = currentX - initialX;
            int offsetY = currentY - initialY;
            if (Math.abs(offsetX) > slop) {
                if (offsetX > DEFAULT_THRESHOLD) {
                    // TODO :: Do Right to Left action!
                } else if (offsetX < -DEFAULT_THRESHOLD) {
                    // TODO :: Do Left to Right action!
                }
            }
            if (Math.abs(offsetY) > slop) {
                if (offsetY > DEFAULT_THRESHOLD) {
                    // TODO :: Do Bottom to Top action!
                } else if (offsetY < -DEFAULT_THRESHOLD) {
                    // TODO :: Do Top to Bottom action!
                }
            }
        } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
            // Do nothing!
        }
};

хорошая вещь об этой реализации заключается в том, что пользователю не придется снимать руку с экрана, контролируя направление змеи.


поместите супер методы в свой код, например:

public void onSwipeTop() {
    super.onSwipeTop();
    Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
}