2015-06-29 2 views
0

следующим образом: https://developer.android.com/training/gestures/movement.htmlonTouchEvent() не работает, как я намерен

для обработки движения в onTouchEvent. Моя проблема заключается в том, что кажется, что прикосновение никогда не регистрируется, даже если оно связано с учебным пособием.

Код:

public class Sprite extends Activity { 

private static final int BMP_ROWS = 4; 
private static final int BMP_COL = 3; 
private int x, y = 0; 
private int speedx, speedy = 5; 
private int currentFrame = 0; 
private int width, height; 
private float xTouch, yTouch; 
private VelocityTracker mVelocityTracker = null; 
private GameView gameView; 
private Bitmap bmp; 

int [] DIRECTION_TO_ANIMATE_MAP = {3, 1, 0, 2}; 

public Sprite(GameView gameView, Bitmap bmp) { 
    this.gameView = gameView; 
    this.bmp = bmp; 
    this.width = bmp.getWidth()/BMP_COL; 
    this.height = bmp.getHeight()/BMP_ROWS; 
} 

private void Update() { 
    if (x >= gameView.getWidth() - width - speedx|| x + speedx <= 0) { 
    } 

    if (y >= gameView.getHeight() - height - speedy || y + speedy <= 0) { 
    } 

    currentFrame = ++currentFrame % BMP_COL; 
} 

public boolean onTouchEvent(MotionEvent event) { 
    int index = event.getActionIndex(); 
    int action = event.getActionMasked(); 
    int pointerId = event.getPointerId(index); 

    synchronized (gameView.getHolder()) { 
     if (this.isCollition(event.getX(), event.getY())) { 
      Log.d("", "Sprite touched!"); 
     } 

     switch (action) { 
      case MotionEvent.ACTION_DOWN: 
       if (mVelocityTracker == null) { 
        mVelocityTracker = VelocityTracker.obtain(); 
       } else { 
        mVelocityTracker.clear(); 
       } 

       xTouch = event.getX(); 
       yTouch = event.getY(); 
       Log.d("", "You clicked: " + Float.toString(xTouch) + "," + Float.toString(yTouch)); 
       mVelocityTracker.addMovement(event); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       mVelocityTracker.addMovement(event); 
       mVelocityTracker.computeCurrentVelocity(1000); 
       Log.d("", "X velocity: " + VelocityTrackerCompat.getXVelocity(mVelocityTracker, pointerId)); 
       Log.d("", "Y velocity: " + VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId)); 
       break; 

      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL: 
       mVelocityTracker.recycle(); 
       break; 

     } 
    } 

    boolean ret = super.onTouchEvent(event); 
    return ret; 
} 

public void onDraw(Canvas canvas) { 
    MotionEvent event = null; 
    Update(); 

    int srcX = 1 * width; 
    int srcY = 0 * height; 

    Rect src = new Rect(srcX, srcY, srcX + width, srcY + height); 
    Rect dst = new Rect(x, y, x + width, y + height); 
    canvas.drawBitmap(bmp, src, dst, null); 

} 

public boolean isCollition(float x2, float y2) { 
    return x2 > x && x2 < x + width && y2 > y && y2 < y + height; 
} 
} 

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


EDIT:

Это было как предложено ниже моей игровой логики, которая была здесь не так. У меня был onTouchEvent в неправильном классе. Когда я изменил его в view класса он отлично работает:

public class GameView extends SurfaceView { 

private Bitmap bmp; 
private SurfaceHolder holder; 
private GameLoop gameLoop; 
private Sprite sprite; 
private int x = 0; 
private long lastClick; 
private VelocityTracker mVelocityTracker; 
private float xTouch; 
private float yTouch; 

public GameView(Context context) { 
    super(context); 
    gameLoop = new GameLoop(this); 
    holder = getHolder(); 
    holder.addCallback(new SurfaceHolder.Callback() { 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
     } 

     @SuppressLint("WrongCall") 
     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      gameLoop.setRunning(true); 
      gameLoop.start(); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     } 

    }); 

    bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image); 
    sprite = new Sprite(this, bmp); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 
    sprite.onDraw(canvas); 
} 

public boolean onTouchEvent(MotionEvent event) { 
    int index = event.getActionIndex(); 
    int action = event.getActionMasked(); 
    int pointerId = event.getPointerId(index); 

    synchronized (getHolder()) { 
     if (sprite.isCollition(event.getX(), event.getY())) { 
      Log.d("", "Sprite touched!"); 
     } 

     switch (action) { 
      case MotionEvent.ACTION_DOWN: 
       if (mVelocityTracker == null) { 
        mVelocityTracker = VelocityTracker.obtain(); 
       } else { 
        mVelocityTracker.clear(); 
       } 

       xTouch = event.getX(); 
       yTouch = event.getY(); 
       Log.d("", "You clicked: " + Float.toString(xTouch) + "," + Float.toString(yTouch)); 
       mVelocityTracker.addMovement(event); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       mVelocityTracker.addMovement(event); 
       mVelocityTracker.computeCurrentVelocity(1000); 
       Log.d("", "X velocity: " + VelocityTrackerCompat.getXVelocity(mVelocityTracker, pointerId)); 
       Log.d("", "Y velocity: " + VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId)); 
       break; 

      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL: 
       mVelocityTracker.recycle(); 
       break; 

     } 
    } 

    boolean ret = super.onTouchEvent(event); 
    return ret; 
} 
} 
+0

Для чего нужен mVelocityTracker? – pskink

+0

Я должен был сказать, что я намерен использовать его для плавной анимации, поэтому, когда я нажимаю экран на месте x, y, у спрайта есть гладкая анимация по отношению к координатам. Я просто следую приведенному выше руководству, но не знаю, насколько это лучше. – Evilunclebill

+0

, тогда попробуйте 'GestureDetector', может быть? см. «GestureDetector.OnGestureListener» и методы 'onFling' /' onScroll', а также: http://developer.android.com/training/custom-views/making-interactive.html – pskink

ответ

1

проверить логику игры снова и обрабатывать возвращаемое значение вручную, а не super.onTouchEvent (событие);

+0

Добавлен 'return true' вместо этого - it был оставлен от предложения, которое не сработало. Когда вы говорите, проверьте логику игры, что вы имеете в виду? – Evilunclebill

+0

проверьте свою логику игры, положите true, false правильно в нужном месте, как вам нужно, например, согласно вашей игровой логике. true обозначает событие, потребленное и false, которое не используется в иерархии прохождения событий. правильно верните значение возврата в вашем случае. – ThatsME

+0

Хорошо, я попробую! – Evilunclebill