Android の surfaceview に基づくゲームの仮想ボタンを設計しています。マルチタッチ機能を実行するために onTouch(MotionEvent event) メソッドをオーバーライドしましたが、思い通りに動作しません。1 本の指でタッチすると、2 本目の指が認識されないため、必要な機能を実行できません。これは、オーバーライドしたメソッドのコードです。
@Override
public boolean onTouchEvent(MotionEvent event){
touchX = (int)event.getX();
touchY = (int)event.getY();
int action = event.getActionMasked();//event.getAction() & MotionEvent.ACTION_MASK;
if(touchX >= 0 && touchX <= leftbutton.getWidth() && touchY >= this.getHeight() - 100 && touchY <= this.getHeight()){
if (action == MotionEvent.ACTION_DOWN){
starship.setLeftRight(1, 0, true);
leftButton.update(touchedleftbutton);
}
else if (action == MotionEvent.ACTION_UP){
starship.setLeftRight(0, 0, false);
leftButton.update(leftbutton);
}
else if (action == MotionEvent.ACTION_POINTER_DOWN){
starship.setLeftRight(1, 0, true);
leftButton.update(touchedleftbutton);
}
else if (action == MotionEvent.ACTION_POINTER_UP){
starship.setLeftRight(0, 0, false);
leftButton.update(leftbutton);
}
}
else if (touchX >= 20 + leftbutton.getWidth() && touchX <= 20 + leftbutton.getWidth() + rightbutton.getWidth() && touchY >= this.getHeight() - 100 && touchY <= this.getHeight()){
if (action == MotionEvent.ACTION_DOWN){
starship.setLeftRight(0, 1, true);
rightButton.update(touchedrightbutton);
}
else if (action == MotionEvent.ACTION_UP){
starship.setLeftRight(0, 0, false);
rightButton.update(rightbutton);
}
else if (action == MotionEvent.ACTION_POINTER_DOWN){
starship.setLeftRight(0, 1, true);
rightButton.update(touchedrightbutton);
}
else if (action == MotionEvent.ACTION_POINTER_UP){
starship.setLeftRight(0, 0, false);
rightButton.update(rightbutton);
}
}
else if(touchX >= this.getWidth() - shootbutton.getWidth() && touchY >+ this.getHeight() - 100 && touchY < this.getHeight()){
if (action == MotionEvent.ACTION_DOWN){
shootButton.update(shoottouched);
}
else if (action == MotionEvent.ACTION_UP){
shootButton.update(shootbutton);
}
else if (action == MotionEvent.ACTION_POINTER_DOWN){
shootButton.update(shoottouched);
}
else if (action == MotionEvent.ACTION_POINTER_UP){
shootButton.update(shootbutton);
}
}
return true;
}
- - - - - - - - - - - - - - - - - - - - - - - 編集 - - --------------------------------------
私は自分の問題を解決することができ、現在はすべて正常に機能しています。これが私の更新されたコードです。私と同じ問題に苦しんでいる人の助けになることを願っています。
@Override
public boolean onTouchEvent(MotionEvent event){
int action = event.getActionMasked();//event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerID = event.getPointerId(pointerIndex);
int pointerCount = event.getPointerCount();
touchX = new int[pointerCount];
touchY = new int[pointerCount];
for(int i = 0; i<pointerCount; i++){
touchX[i] = (int) event.getX(i);
touchY[i] = (int) event.getY(i);
}
switch(action){
case MotionEvent.ACTION_DOWN:
if(touchX[0] >= 0 && touchX[0] <= leftbutton.getWidth() && touchY[0] >= this.getHeight() - 100 && touchY[0] <= this.getHeight()){
starship.setLeftRight(1, 0, true);
leftButton.update(touchedleftbutton);
}
else if (touchX[0] >= 20 + leftbutton.getWidth() && touchX[0] <= 20 + leftbutton.getWidth() + rightbutton.getWidth() && touchY[0] >= this.getHeight() - 100 && touchY[0] <= this.getHeight()){
starship.setLeftRight(0, 1, true);
rightButton.update(touchedrightbutton);
}
else if(touchX[0] >= this.getWidth() - shootbutton.getWidth() && touchY[0] >+ this.getHeight() - 100 && touchY[0] < this.getHeight()){
shootButton.update(shoottouched);
}
break;
case MotionEvent.ACTION_UP:
if(touchX[0] >= 0 && touchX[0] <= leftbutton.getWidth() && touchY[0] >= this.getHeight() - 100 && touchY[0] <= this.getHeight()){
starship.setLeftRight(0, 0, false);
leftButton.update(leftbutton);
}
else if (touchX[0] >= 20 + leftbutton.getWidth() && touchX[0] <= 20 + leftbutton.getWidth() + rightbutton.getWidth() && touchY[0] >= this.getHeight() - 100 && touchY[0] <= this.getHeight()){
starship.setLeftRight(0, 0, false);
rightButton.update(rightbutton);
}
else if(touchX[0] >= this.getWidth() - shootbutton.getWidth() && touchY[0] >+ this.getHeight() - 100 && touchY[0] < this.getHeight()){
shootButton.update(shootbutton);
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
if(touchX[pointerID] >= 0 && touchX[pointerID] <= leftbutton.getWidth() && touchY[pointerID] >= this.getHeight() - 100 && touchY[pointerID] <= this.getHeight()){
starship.setLeftRight(1, 0, true);
leftButton.update(touchedleftbutton);
}
else if (touchX[pointerID] >= 20 + leftbutton.getWidth() && touchX[pointerID] <= 20 + leftbutton.getWidth() + rightbutton.getWidth() && touchY[pointerID] >= this.getHeight() - 100 && touchY[pointerID] <= this.getHeight()){
starship.setLeftRight(0, 1, true);
rightButton.update(touchedrightbutton);
}
else if(touchX[pointerID] >= this.getWidth() - shootbutton.getWidth() && touchY[pointerID] >+ this.getHeight() - 100 && touchY[pointerID] < this.getHeight()){
shootButton.update(shoottouched);
}
break;
case MotionEvent.ACTION_POINTER_UP:
if(touchX[pointerID] >= 0 && touchX[pointerID] <= leftbutton.getWidth() && touchY[pointerID] >= this.getHeight() - 100 && touchY[pointerID] <= this.getHeight()){
starship.setLeftRight(0, 0, false);
leftButton.update(leftbutton);
}
else if (touchX[pointerID] >= 20 + leftbutton.getWidth() && touchX[pointerID] <= 20 + leftbutton.getWidth() + rightbutton.getWidth() && touchY[pointerID] >= this.getHeight() - 100 && touchY[pointerID] <= this.getHeight()){
starship.setLeftRight(0, 0, false);
rightButton.update(rightbutton);
}
else if(touchX[pointerID] >= this.getWidth() - shootbutton.getWidth() && touchY[pointerID] >+ this.getHeight() - 100 && touchY[pointerID] < this.getHeight()){
shootButton.update(shootbutton);
}
break;
}
return true;
}