【问题标题】:onSingleTapConfirmed is never triggeredonSingleTapConfirmed 永远不会被触发
【发布时间】:2019-02-23 16:08:19
【问题描述】:

我正在尝试为点击和投掷实现点击侦听器,但由于某种原因,onSingleTapConfirmed 方法从未被触发,我真的不知道为什么。

我在一个不同的项目中尝试过这个,只有两个按钮,我在那里实现它没有问题,但由于某种原因,在这个应用程序中,即使代码相同,它也不起作用。

MyGestureDetector.class:

公共类 MyGestureDetector 扩展 GestureDetector.SimpleOnGestureListener {

private MainGame mainGame;

MyGestureDetector(MainGame mainGame) {
    this.mainGame = mainGame;
}

@Override
public boolean onDown(MotionEvent e) {
    Log.d("GESTURE", "OnDOwn detected");
    return true;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    Log.d("GESTURE: ", "Single Tap detected");
    mainGame.clickedView();
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    try {
        if (e1.getY() < e2.getY()) {
            Log.d("Gesture", "Up to Down swipe: " + e1.getY() + " - " + e2.getY());
            Log.d("Speed", String.valueOf(velocityY) + "pixels/second");
            Objects.requireNonNull(mainGame.getSupportActionBar()).show();
        }

        if (e1.getY() > e2.getY()) {
            Log.d("Gesture", "Down to Up swipe: " + e1.getY() + " - " + e2.getY());
            Log.d("Speed", String.valueOf(velocityY) + "pixels/second");
            Objects.requireNonNull(mainGame.getSupportActionBar()).hide();
        }

    } catch (NullPointerException e) {
        Log.d("ActionBar: ", "Nullpoint caught");
    }
    return true;
}
}

MainGame.class (sn-ps):

public class MainGame extends AppCompatActivity implements View.OnTouchListener {
ConstraintLayout layout;
TextView fullNameP1;
TextView fullNameP2;
TextView gameScoreP1;
TextView gameScoreP2;
View mCurrenView;
private MyGestureDetector = myGestureDetector;
private GestureDetector mGestureDetector;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    Objects.requireNonNull(getSupportActionBar()).hide();
    setContentView(R.layout.activity_main_game);

    initializeLayoutViews();
    initializeLayoutValues();

    int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_IMMERSIVE;
    layout.setSystemUiVisibility(uiOptions);


    layout.setOnTouchListener(this);
    gameScoreP1.setOnTouchListener(this);        
    gameScoreP2.setOnTouchListener(this);
    fullNameP1.setOnTouchListener(this);
    fullNameP2.setOnTouchListener(this);
}

private void initializeLayoutViews() {
layout = findViewById(R.id.gameLayout);
mainLayout.clone(layout);
fullNameP1 = findViewById(R.id.fullNameP1);
fullNameP2 = findViewById(R.id.fullNameP2);
gameScoreP1 = findViewById(R.id.gameScoreP1);
gameScoreP2 = findViewById(R.id.gameScoreP2);
myGestureDetector = new MyGestureDetector(this);
mGestureDetector = new GestureDetector(this, myGestureDetector);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    this.mGestureDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    mCurrenView = v;
    return this.mGestureDetector.onTouchEvent(event);
}

void clickedView() {
switch(mCurrenView.getId()) {
//perform actions
}
}
}

这是我在屏幕上任何地方的日志:

2019-02-23 17:51:24.801 7177-7177/包裹 D/手势: OnDown 检测到 2019-02-23 17:51:25.612 7177-7177/包 D/GESTURE:检测到 OnDown 2019-02-23 17:51:26.190 7177-7177/package D/GESTURE:检测到 OnDown 2019-02-23 17:51:26.718 7177-7177/package D/GESTURE:检测到 OnDown 2019-02-23 17:51:26.869 7177-7177/包D/手势:下 向上滑动:275.33337 - -5.333313 2019-02-23 17:51:27.364 7177-7177/package D/GESTURE:检测到 OnDown 2019-02-23 17:51:27.575 7177-7177/包D/手势:从上到下 刷卡:466.6667 - 772.3962 2019-02-23 17:51:28.438 7177-7177/package D/GESTURE:检测到 OnDown 2019-02-23 17:51:28.643 7177-7177/D 包/手势:从下到上 刷卡:215.33337 - -52.07727 2019-02-23 17:51:29.224 7177-7177/package D/GESTURE:检测到 OnDown 2019-02-23 17:51:29.414 7177-7177/包D/手势:从上到下 刷卡:8.0 - 272.0 2019-02-23 17:51:30.584 7177-7177/package D/GESTURE:检测到 OnDown 2019-02-23 17:51:35.959 7177-7177/package D/GESTURE:检测到 OnDown 2019-02-23 17:51:36.356 7177-7177/包D/GESTURE: OnDown 检测到 2019-02-23 17:51:36.737 7177-7177/包 D/GESTURE:检测到 OnDown

如您所见,onSingleTapConfirmed 永远不会触发,即使我所做的只是在OnDown 之前没有滑动时进行简单的点击。

编辑 做了一些测试记录操作,问题是手势检测器由于某种原因看不到我的任何视图,除了layout,因为onSingleTapConfirmed在任何文本视图之外被触发,而且如果我为它们禁用监听器. 伙计们,我真的需要帮助!

【问题讨论】:

    标签: java android ontouchlistener touch-event gesturedetector


    【解决方案1】:

    似乎其他视图由于某种原因无法点击。

    在添加侦听器之前添加以下内容后,代码现在按预期工作:

        gameScoreP1.setClickable(true);
        gameScoreP2.setClickable(true);
        fullNameP1.setClickable(true);
        fullNameP2.setClickable(true);
    

    【讨论】:

      【解决方案2】:

      返回GestureDetector的onTouchEvent提供的值:

      @Override
      public boolean onTouchEvent(MotionEvent event) {
          return this.mGestureDetector.onTouchEvent(event);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-12
        • 2021-02-01
        • 1970-01-01
        • 2019-08-28
        • 1970-01-01
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多