Pregunta

Como desarrollador, tiendo a programa de investigación primero y luego más tarde. Yo estaba tratando de poner en práctica una pantalla que manejar múltiples entradas del usuario. Básicamente asignar más de un solo dedo. Probé dos cosas ..

Yo tenía una tipo de actividad que implementó OnTouchListener. Aquí tuve dos puntos de vista distintos niño que agregaron la actividad como sus oyentes ontouch. Y entonces tuve una línea de impresión que imprime la event.getPointerCount () e imprime la ubicación de cada uno de los punteros ..

descargado en el teléfono y lo probó. Noté que los punteros no crecieron mayor que dos. Incluso me di cuenta de si un dedo estaba en un niño y otro dedo en el otro punto de vista del niño que los eventos sólo se hicieron con el primer componente secundario. A continuación traté de poner detectores independientes en cada uno de los componentes hijos para ver si eso fuera a funcionar, pero actué de la misma.

Por lo tanto, parece que el Android sólo es compatible con un total de dos entradas del usuario cuando se trata de entradas desde el usuario toque la pantalla.

¿Es esto cierto? Al parecer, de pruebas e investigaciones que este es el caso.

tiene funcionó a nadie a esta limitación. Cualquier arounds de trabajo inteligente?

Gracias por su tiempo y respuestas.

dk

¿Fue útil?

Solución

El número de puntos de contacto soportado es dependiente en el dispositivo. En todas las versiones actualmente disponibles de MotionEvents Android son enviados a un solo punto de vista objetivo y describir el estado de todos los puntos de contacto actualmente activos. La vista de destino se determina por el lugar donde se produce el primer evento MotionEvent.ACTION_DOWN.

dar sentido puesto de Multitouch en el Desarrolladores de Android Blog por una visión rápida de la utilización de eventos multitáctiles en Android.

Otros consejos

Me escribió una aplicación muy sencilla para múltiples pruebas toque en mi teléfono HTC Incredible. Me comporto muy parecido a lo que pensaba y más o menos como la URL dada por adamp. Mis resultados es que el teléfono sólo podía manejar dos entradas digitales. Tengo de caja que cada uno tiene su propia OnTouchListener. Cuando pulso en cada caja imprimo un texto para cada uno. Al hacer clic en cada uno de los eventos get al tacto pero con el dedo índice que se hace clic en cualquier lugar de la pantalla Tengo dos punteros. A partir del método MotionEvent event.getPointerCount. No importa donde aterrizó el segundo dedo. Podría haber estado fuera de la vista original que recibió el primer dedo por evento. De todas formas aquí está el código si lo desea hacerlo por uno mismo.

Tengo un 7z de todo el proyecto, pero no creo que puedo adjuntarlo.

Así pues, aquí es la actividad principal y el código XML para el diseño.

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;
        }

    }
}

Diseño:

<?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>

Buena suerte, y si se intenta Avísame si obtiene el GOT triples !! imprimir declaraciones. Me pregunto lo que los teléfonos lo soporta.

gracias, dk

Me editado @dakira respuesta. Aquí está el mi código de ejemplo:

<?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>

Aquí está el código de Java:

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;
        }
    }
}

Espero que esto va a resolver un problema muchas personas:)

introducir descripción de la imagen aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top