为什么我的代码无法识别刷卡?

时间:2018-11-28 00:54:03

标签: java android

我正在制作只需要识别滑动的Android游戏。但是,由于某种原因,从未调用过onFling方法。我对修改onScroll或其他方法没有任何问题,只是为了使onFling起作用。 GestureDetectGridView只是一个基本类,它调用gridView超级构造函数。运动控制器也绝对正确。因此问题必须在此类中。

public class TwentyGestureDetectGridView extends GestureDetectGridView implements View.OnTouchListener, GestureDetector.OnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 100;
private final GestureDetector gDetector;
private TwentyMovementController mController;

public TwentyGestureDetectGridView(Context context) {
    super(context);
    gDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener());
    mController = new TwentyMovementController();
}

public TwentyGestureDetectGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
    gDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener());
    mController = new TwentyMovementController();
}

public TwentyGestureDetectGridView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    gDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener());
    mController = new TwentyMovementController();
}

public void onSwipeUp(){}

public void onSwipeDown(){}

public void onSwipeLeft() {}

public void onSwipeRight() {}


public boolean onTouch(View v, MotionEvent event) {
    return gDetector.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    float distanceX = e2.getX() - e1.getX();
    float distanceY = e2.getY() - e1.getY();
    if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_MIN_DISTANCE) {
        if (distanceX > 0) {
            onSwipeRight();
        } else {
            onSwipeLeft();
        }
        return true;

    } else if (Math.abs(distanceY) > Math.abs(distanceX) && Math.abs(distanceY) > SWIPE_MIN_DISTANCE) {
        if (distanceY > 0) {
            onSwipeUp();
        } else {
            onSwipeDown();
        }
        return true;
    }

    return false;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return true;}

2 个答案:

答案 0 :(得分:0)

您缺少对View.setOnTouchListener的呼叫

对于要在其中注册滑动视图的视图(可能是您的基本布局),请调用view.setOnTouchListener(此处为您的监听器)

也许是这样的:

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstance){
  View root = somehowCreateView();

  root.setOnTouchListener(this);
  return root;
}

答案 1 :(得分:0)

public class TwentyGameActivity extends GameActivity implements Observer {

TwentyBoardManager twentyBoardManager;

private TwentyGestureDetectGridView gridView;

private static int columnWidth, columnHeight;

ArrayList<Button> tileButtons;

public void display() {
    updateTileButtons();
    gridView.setAdapter(new CustomAdapter(tileButtons, columnWidth, columnHeight));
}

private void createTileButtons(Context context){
    TwentyBoard board = twentyBoardManager.getBoard();
    tileButtons = new ArrayList<>();
    for (int row = 0; row != board.getNumRows(); row++) {
        for (int col = 0; col != board.getNumCols(); col++) {
            Button tmp = new Button(context);
            tmp.setBackgroundResource(board.getTile(row, col).getBackground());
            this.tileButtons.add(tmp);
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    twentyBoardManager = (TwentyBoardManager) Savable.loadFromFile(TEMP_SAVE_FILENAME);
    createTileButtons(this);
    setContentView(R.layout.activity_twenty_game);

    gridView = findViewById(R.id.gridTwenty);
    gridView.setNumColumns(twentyBoardManager.getSize());
    gridView.setBoardManager(twentyBoardManager);
    twentyBoardManager.addObserver(this);

    gridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            gridView.getViewTreeObserver().removeOnGlobalLayoutListener(
                    this);
            int displayWidth = gridView.getMeasuredWidth();
            int displayHeight = gridView.getMeasuredHeight();

            columnWidth = displayWidth / twentyBoardManager.twentyBoard.getNumCols();
            columnHeight = displayHeight / twentyBoardManager.twentyBoard.getNumCols();

            display();
        }
    });

    addUndoButtonListener();
    twentyBoardManager.twentyBoard.generateRandomTile();
}

private void addUndoButtonListener(){
    Button undoButton = findViewById(R.id.undoTwentyButton);
    undoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            twentyBoardManager.undo();
        }
    });
}

@Override
public void update(Observable o, Object arg) {
    display();
}

private void updateTileButtons() {
    TwentyBoard board = twentyBoardManager.getBoard();
    int nextPos = 0;
    for (Button b : tileButtons) {
        int row = nextPos / board.getNumCols();
        int col = nextPos % board.getNumCols();
        b.setBackgroundResource(board.getTile(row, col).getBackground());
        nextPos++;
    }
}

}