यह देखते हुए कि आप अलगाव में जॉयस्टिक और आग बटन में हेरफेर कर सकते हैं, यह तर्क करने कि आप स्क्रीन आयाम सही ढंग से हो रही है और अपने खेल वस्तु के लिए एक सूचक के आसपास के क्षेत्र का पता लगाने के बारे में सब कुछ सही है खड़ा है। मैंने कुछ एंड्रॉइड संस्करणों और मल्टी टच के साथ मुद्दों के बारे में पढ़ा है, लेकिन मान लीजिए कि यह समस्या नहीं है।
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;
}
}
}
अगर यह एक हार्डवेयर बात है: प्रयास करें। कुछ Google उपकरणों में मल्टीटाउच के साथ अजीब समस्याएं हैं: https://play.google.com/store/apps/details?id=multitouchpro.tests&hl=de – devsnd
मुझे नहीं लगता कि यह एक हार्डवेयर चीज है। बहु स्पर्श मेरे फोन पर अच्छी तरह से काम करता है। मैं इसे अपने आकाशगंगा एस 2 पर परीक्षण कर रहा हूं – user1229888