2011-01-17 11 views
6

एक डेवलपर के रूप में, मैं पहले प्रोग्राम करता हूं और बाद में शोध करता हूं। मैं एक स्क्रीन को लागू करने की कोशिश कर रहा था जो एकाधिक उपयोगकर्ता इनपुट को संभालेगा। मूल रूप से केवल एक उंगली से अधिक नक्शा। मैंने दो चीजों की कोशिश की ..एंड्रॉइड मल्टीटाउच?

मेरे पास एक गतिविधि वर्ग था जिसने ऑन टचलिस्टर को लागू किया था। यहां मेरे दो अलग-अलग बच्चे के विचार थे जिन्होंने गतिविधि को उनके ऑनचच श्रोताओं के रूप में जोड़ा। और फिर मेरे पास एक प्रिंट लाइन थी जिसने घटना को मुद्रित किया .getPointerCount() और प्रत्येक पॉइंटर्स के स्थान को मुद्रित किया ..

इसे फ़ोन पर डाउनलोड किया और इसका परीक्षण किया। मैंने देखा कि पॉइंटर्स दो से अधिक नहीं बढ़े। मैंने यह भी देखा कि क्या एक उंगली एक बच्चे पर थी और दूसरे बच्चे पर एक और उंगली देखती थी कि घटनाओं ने इसे केवल पहले बच्चे के घटक में बनाया था। इसके बाद मैंने यह देखने के लिए कि क्या यह काम करेगा, अलग-अलग श्रोताओं को अलग-अलग श्रोताओं को रखने की कोशिश की, लेकिन यह वही काम करता था।

तो, ऐसा लगता है कि एंड्रॉइड केवल स्क्रीन को छूने वाले उपयोगकर्ता से इनपुट से निपटने के दौरान कुल दो उपयोगकर्ता इनपुट का समर्थन करता है।

क्या यह सच है? यह परीक्षण और शोध से लगता है कि यह मामला है।

क्या कोई इस सीमा में भाग गया है। कोई चालाक काम आसपास है?

आपके लिए समय और प्रतिक्रियाएं धन्यवाद।

डीके

उत्तर

7

समर्थित स्पर्श बिंदुओं की संख्या डिवाइस पर निर्भर है। एंड्रॉइड MotionEvent एस के वर्तमान में उपलब्ध संस्करणों में एक ही लक्ष्य दृश्य में भेजा गया है और वर्तमान में सक्रिय स्पर्श बिंदुओं की स्थिति का वर्णन किया गया है। लक्ष्य दृश्य निर्धारित करता है कि पहले MotionEvent.ACTION_DOWN घटना होती है।

Android डेवलपर ब्लॉग पर एंड्रॉइड पर मल्टीटाउच ईवेंट के साथ काम करने के त्वरित अवलोकन के लिए Making Sense of Multitouch पोस्ट देखें।

+0

यूआरएल के लिए धन्यवाद का समाधान होगा, यह मदद की कुछ चीजों को साफ़ करें। लेकिन मुझे इसे अपने लिए देखना पड़ा। इसलिए, मैंने लेख में जो कहा था उसका परीक्षण करने के लिए एक सरल ऐप लिखा था। इस प्रश्न के उत्तर में कोड जोड़ देगा। – dakira

3

मैंने अपने एचटीसी इनक्रेडिबल फोन पर एकाधिक स्पर्श का परीक्षण करने के लिए एक बहुत ही सरल एप्लीकेशन लिखा था। मैं बहुत ज्यादा व्यवहार करता हूं जैसे मैंने सोचा और एडैम्प द्वारा दिए गए यूआरएल की तरह काफी कुछ। मेरे परिणाम यह है कि फोन केवल दो उंगली इनपुट को संभाल सकता है। मेरे पास बॉक्स के लिए है कि प्रत्येक का अपना ऑन टचलिस्टर है। जब मैं प्रत्येक बॉक्स पर क्लिक करता हूं तो मैं प्रत्येक के लिए एक टेक्स्ट प्रिंट करता हूं। प्रत्येक टच इवेंट पर क्लिक करके, लेकिन मेरी इंडेक्स उंगली के साथ मैंने स्क्रीन पर कहीं भी क्लिक किया, मुझे दो पॉइंटर्स मिल गए। मोशनवेवेंट इवेंट .getPointerCount विधि से। इससे कोई फर्क नहीं पड़ता कि दूसरी उंगली कहाँ उतरा। मूल दृश्य के बाहर हो सकता था जिसे पहली उंगली नीचे घटना मिली थी। अगर आप इसे स्वयं करना चाहते हैं तो वैसे भी कोड है।

मेरे पास पूरी परियोजना का 7z है लेकिन मुझे नहीं लगता कि मैं इसे संलग्न कर सकता हूं।

तो, यहां लेआउट के लिए मुख्य गतिविधि और एक्सएमएल है।

package com.multitouch; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class MultiTouch extends Activity { 
    protected LinearLayout sq1; 
    protected LinearLayout sq2; 
    protected LinearLayout sq3; 
    protected LinearLayout sq4; 

    protected String sqText = new String(); 
    protected String sq1Text = new String(); 
    protected String sq2Text = new String(); 
    protected String sq3Text = new String(); 

    private Handler handler = new Handler(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setViews(); 
     handler.postDelayed(mUpdateUITimerTask, 5000); 
    } 

    private final Runnable mUpdateUITimerTask = new Runnable() { 
     public void run() { 
      // do whatever you want to change here, like: 
      updateTextField(); 
     } 
    }; 

    private void updateTextField() { 
     TextView view1 = (TextView) this.findViewById(R.id.logView); 
     TextView view2 = (TextView) this.findViewById(R.id.logView1); 
     TextView view3 = (TextView) this.findViewById(R.id.logView2); 
     TextView view4 = (TextView) this.findViewById(R.id.logView3); 


     //view1.append(sqText + "\n"); 
     view1.setText(sqText); 
     view2.setText(sq1Text); 
     view3.setText(sq2Text); 
     view4.setText(sq3Text); 

     handler.post(mUpdateUITimerTask); 
    } 

    private void setViews() { 
     sq1 = (LinearLayout) this.findViewById(R.id.square1); 
     sq2 = (LinearLayout) this.findViewById(R.id.square2); 
     sq3 = (LinearLayout) this.findViewById(R.id.square3); 
     sq4 = (LinearLayout) this.findViewById(R.id.square4); 

     sq1.setOnTouchListener(new TouchListener()); 
     sq2.setOnTouchListener(new TouchListener()); 
     sq3.setOnTouchListener(new TouchListener()); 
     sq4.setOnTouchListener(new TouchListener());   
    } 

    private class TouchListener implements OnTouchListener { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      if(event.getPointerCount()>2) { 
       sq1Text = "GOT THREE POINTERS!!"; 
       sq2Text = "GOT THREE POINTERS!!"; 
       sq3Text = "GOT THREE POINTERS!!"; 
       sqText = "GOT THREE POINTERS!!"; 
      } 

      if(event.getAction() == MotionEvent.ACTION_DOWN){ 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_DOWN || 
         event.getAction() == MotionEvent.ACTION_POINTER_UP) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_1_DOWN) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_UP) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_MOVE) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } 


      // TODO Auto-generated method stub 
      return true; 
     } 

    } 
} 

लेआउट:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:gravity="center_horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/MainLay" > 

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     android:gravity="center_horizontal" android:padding="10dip"> 


     <TableRow android:gravity="center_horizontal" android:padding="10dip"> 
      <LinearLayout android:background="#FFFF00" android:id="@+id/square1" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
      <LinearLayout android:background="#FF00FF" android:id="@+id/square2" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
     </TableRow> 

     <TableRow android:gravity="center_horizontal" android:padding="10dip"> 
      <LinearLayout android:background="#00FFFF" android:id="@+id/square3" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
      <LinearLayout android:background="#eeeeee" android:id="@+id/square4" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
     </TableRow>  


      <TextView android:id="@+id/logView" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
      <TextView android:id="@+id/logView1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
      <TextView android:id="@+id/logView2" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
      <TextView android:id="@+id/logView3" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 



    </TableLayout> 

</LinearLayout> 

गुड लक, और आप इसे मुझे पता है अगर आप GOT तीन संकेत मिलता है की कोशिश करता है, तो !! प्रिंट स्टेटमेंट्स मुझे आश्चर्य है कि कौन से फोन इसका समर्थन करते हैं।

धन्यवाद, dk

+0

गैलेक्सी एस पांच काउंटर तक का समर्थन करता प्रतीत होता है। ऊपर दिए गए सॉफ़्टवेयर का उपयोग करके किसी भिन्न मंच से किसी के द्वारा दिखाया गया। एक एलजी ऑप्टिमस का उपयोग कर – dakira

+0

। केवल 1 काउंटर का पता लगाता है। – Brahadeesh

0

मैं @dakira जवाब का संपादन किया।

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/MainLay" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_horizontal" 
    android:orientation="vertical"> 


    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:id="@+id/tvHeader" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:padding="4dp" 
      android:text="Place Your Finger on Squire" 
      android:textColor="#000" 
      android:textSize="20sp" /> 

     <LinearLayout 
      android:id="@+id/llStatusHolder" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/tvHeader" 
      android:orientation="vertical" 
      android:weightSum="2"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:padding="8dp" 
       android:weightSum="2"> 

       <TextView 
        android:id="@+id/tvBox1" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:background="#FFFF00" 
        android:gravity="center" 
        android:padding="4dp" 
        android:text="Finger : 0" 
        android:textColor="#000" 
        android:textSize="28sp" /> 

      </LinearLayout> 

     </LinearLayout> 


     <LinearLayout 
      android:id="@+id/square1" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="4dp" 
      android:layout_below="@+id/llStatusHolder" 
      android:layout_weight="1" 
      android:background="#FFFF00" 
      android:orientation="horizontal" 
      android:padding="10dp"> 

     </LinearLayout> 

     </RelativeLayout> 
    </LinearLayout> 

यहाँ जावा कोड है: यहाँ मेरी नमूना कोड है

import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.LinearLayout; 
import android.widget.TextView; 


public class MultiTouchTestActivity extends Activity { 
    protected LinearLayout sq1; 

    TextView tvBox1; 
    int counter1 = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_multi_touch_test); 
     setViews(); 
    } 

    private void updateTextField() { 

     tvBox1.setText("Finger : " + counter1); 

    } 

    private void setViews() { 
     tvBox1 = (TextView) findViewById(R.id.tvBox1); 
     sq1 = (LinearLayout) this.findViewById(R.id.square1); 

     sq1.setOnTouchListener(new TouchListener()); 

    } 

    private class TouchListener implements OnTouchListener { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      if (event.getAction() == 1) { 
       setCounterValue(1, 0); 
      }else if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_DOWN || 
        event.getAction() == MotionEvent.ACTION_POINTER_UP) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_1_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
       setCounterValue(1, event.getPointerCount()); 
      }else if (event.getAction() == MotionEvent.ACTION_BUTTON_RELEASE) { 
       setCounterValue(1, 0); 
      } 
      updateTextField(); 
      return true; 
     } 
    } 

    void setCounterValue(int hasvalue, int value) { 
     switch (hasvalue) { 
      case 1: 
       counter1 = value; 
       break; 
     } 
    } 
} 

आशा इस कई व्यक्तियों समस्या :)

enter image description here

संबंधित मुद्दे