Eğer izolasyon joystick ve yangın düğmesini işleyebilirsiniz göz önüne alındığında, doğru ekran boyutlarını alıyoruz ve oyun nesnesine bir işaretçinin civarı algılama konusunda her şey doğru olduğunu nedenle duran. Belirli Android sürümleri ve çoklu dokunuşla ilgili sorunları okudum, ancak bunun sorun olmadığını varsayalım.
MotionEvent
ile zor olan şey, birden çok gösterici için kapatılmış olması ve dokunma ve hareketle ilgileniyorsanız, tüm olası işaretleri dikkate almanız gerektiğidir. Meselenin sizin yaklaşımınızda olabileceğini düşünüyorum.
Kullanıcının ne dokunduğunu belirlemek ve ardından farklı türdeki olaylar hakkında ne yapılması gerektiğini bulmak yerine, hangi olay türünün oluştuğunu belirlemeli ve ardından kullanıcının hangi nesneyle etkileşim kurduğunu belirlemelisiniz. Bu, kodunuzu biraz daha temiz hale getirecek ve gelecekte sorunları tespit etmenizi kolaylaştıracak.
Yukarıdaki örneğini aldım ve aşağıdaki şekilde yeniden yazdım. Bu örnek, kullanıcının neye/nerede dokunacağını göstermek için ekrana metin yazacaktır. Yangın butonundan sonra joystick dokunuşlarını belirleyebilir ve bunun tersi de mümkündür. Bir donanım şeymiş
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;
}
}
}
deneyin. Bazı google cihazların multitouch ile ilgili garip sorunları var: https://play.google.com/store/apps/details?id=multitouchpro.tests&hl=de – devsnd
Bunun bir donanım işi olduğunu düşünmüyorum. Çoklu dokunuş telefonumda iyi çalışıyor. Ben galaksim s2 üzerinde test ediyorum – user1229888