Cho rằng bạn có thể thao tác các nút điều khiển và lửa trong sự cô lập, nó đứng vào lý do mà bạn đang nhận được các kích thước màn hình một cách chính xác và mọi thứ khác về việc phát hiện vùng lân cận của một con trỏ đến đối tượng trò chơi của bạn là đúng. Tôi đã đọc về các vấn đề với một số phiên bản Android và đa cảm ứng nhưng hãy giả sử đó không phải là vấn đề.
Điều khó khăn với một MotionEvent
là nó được tắt cho nhiều con trỏ và nếu bạn quan tâm đến chạm và chuyển động, bạn cần phải xem xét tất cả các con trỏ có thể. Tôi nghĩ vấn đề có thể nằm trong cách tiếp cận của bạn. Thay vì xác định những gì người dùng đang chạm vào và sau đó tìm ra điều cần làm cho các loại sự kiện khác nhau, bạn nên tìm ra loại sự kiện nào đang xảy ra và sau đó xác định đối tượng người dùng đang tương tác với. Điều này sẽ làm cho mã của bạn sạch hơn một chút và giúp dễ dàng phát hiện ra các vấn đề trong tương lai.
Tôi lấy ví dụ của bạn ở trên và viết lại nó như hiển thị bên dưới. Ví dụ này sẽ chỉ viết văn bản vào màn hình để hiển thị những gì/nơi người dùng đang chạm vào. Nó có thể xác định các phím điều khiển chạm sau nút lửa và ngược lại.
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;
}
}
}
Vui lòng thử nếu đó là một điều phần cứng. Một số thiết bị google có vấn đề lạ với multitouch: https://play.google.com/store/apps/details?id=multitouchpro.tests&hl=de – devsnd
Tôi không nghĩ rằng đó là một điều phần cứng. Multi touch hoạt động tốt trên điện thoại của tôi. Tôi đã thử nghiệm nó trên thiên hà của tôi s2 – user1229888