既然你可以操縱孤立的操縱桿和開火按鈕,按理說,你得到正確的屏幕尺寸和其他一切有關檢測指針的附近,以你的遊戲目標是正確的。我已閱讀了某些Android版本和多點觸控的問題,但讓我們假設這不是問題。
MotionEvent
這個棘手的問題是,它會被多個指針觸發,如果你對觸摸和移動感興趣,你需要考慮所有可能的指針。我認爲這個問題可能在於你的方法。
與其確定用戶正在觸摸什麼,然後確定在給定不同類型的事件時該怎麼做,您應該弄清楚發生了什麼類型的事件,然後確定用戶正在與哪些對象進行交互。這將使您的代碼更清晰一些,並且可以更輕鬆地在將來發現問題。
我把上面的例子重寫了下面的代碼。這個例子只是寫文本到屏幕上來顯示用戶正在觸摸什麼/在哪裏。它能夠在火災按鈕之後確定操縱桿觸摸,反之亦然。
MultiTouchGame.java
package com.droidhut.stackoverflow;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.TextView;
public class MultiTouchGame extends Activity implements OnTouchListener {
StringBuilder builder = new StringBuilder();
TextView textView;
boolean[] joystickTouched = new boolean[10];
boolean[] fireButtonTouched = new boolean[10];
int joyX = 0;
int joyY = 0;
int screenHeight;
int screenWidth;
Pad pad = new Pad();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
textView.setText("Touch and drag (multiple fingers supported)!");
textView.setOnTouchListener(this);
setContentView(textView);
WindowManager mWinMgr = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
mWinMgr.getDefaultDisplay().getMetrics(dm);
screenHeight = dm.heightPixels;
screenWidth = dm.widthPixels;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pI = event.getPointerId(pointerIndex);
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
joystickTouched[pI] = isPointerOnJoystick(event, pointerIndex);
fireButtonTouched[pI] = isPointerOnFireButton(event, pointerIndex);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
joystickTouched[pI] = false;
fireButtonTouched[pI] = false;
break;
case MotionEvent.ACTION_MOVE:
joystickTouched[pI] = isPointerOnJoystick(event, pointerIndex);
fireButtonTouched[pI] = isPointerOnFireButton(event, pointerIndex);
if (isTouchingJoystick()){
int index = getJoystickPointer();
if (index != -1 && index < event.getPointerCount()){
joyX = (int)event.getX(index);
joyY = (int)event.getY(index);
}
}
break;
}
updateTextView();
return true;
}
private boolean isPointerOnJoystick(MotionEvent event, int pointerIndex){
return (event.getX(pointerIndex)<pad.getWidth()+(screenWidth*.18)&&event.getX(pointerIndex)>0&&
event.getY(pointerIndex)<(screenHeight)&&event.getY(pointerIndex)>(screenHeight-(0.42*screenHeight)));
}
private boolean isPointerOnFireButton(MotionEvent event, int pointerIndex){
return (event.getX(pointerIndex)>screenWidth/3);
}
private boolean isTouchingJoystick(){
for (int i = 0; i < joystickTouched.length; i++){
if (joystickTouched[i]){
return true;
}
}
return false;
}
private boolean isTouchingFireButton(){
for (int i = 0; i < fireButtonTouched.length; i++){
if (fireButtonTouched[i]){
return true;
}
}
return false;
}
private int getJoystickPointer(){
for (int i = 0; i < joystickTouched.length; i++){
if (joystickTouched[i]){
return i;
}
}
return -1;
}
private void updateTextView() {
builder.setLength(0);
builder.append(String.format("screenWidth[%d], screenHeight[%d]\n",screenWidth, screenHeight));
builder.append(String.format("joystickTouched[%s]\n", isTouchingJoystick()));
builder.append(String.format("fireButtonTouched[%s]\n", isTouchingFireButton()));
builder.append(String.format("joystickMovement[%d,%d]",joyX,joyY));
textView.setText(builder.toString());
}
private static class Pad {
public int getWidth(){
return 200;
}
}
}
請嘗試,如果它是一個硬件的事情。一些谷歌設備有多點觸摸奇怪的問題:https://play.google.com/store/apps/details?id=multitouchpro.tests&hl=de – devsnd 2012-03-13 10:39:14
我不認爲這是一個硬件的事情。多點觸控在我的手機上運行良好。我一直在我的銀河系s2上測試它 – user1229888 2012-03-14 14:59:25