Frage

Als Entwickler, neige ich zu Programm zuerst dann später erforschen. Ich habe versucht, einen Bildschirm zu implementieren, die mehrere Benutzereingaben verarbeiten würde. Im Grunde genommen mehr Karte als nur einen Finger. Ich habe versucht, zwei Dinge ..

Ich hatte eine Aktivitätsklasse, die OnTouchListener umgesetzt. Hier hatte ich zwei separate Kinder Ansichten, die die Aktivität als ihre OnTouch Zuhörer hinzugefügt. Und dann hatte ich eine Druckzeile, dass die event.getPointerCount ausgedruckt () und die Position jedes der Zeiger ausgedruckt ..

es auf das Telefon heruntergeladen und getestet. Ich bemerkte, dass die Zeiger nie mehr als zwei wuchsen. Ich habe sogar festgestellt, wenn ein Finger auf einem Kind und einen anderen Finger auf der anderen untergeordneten Ansicht ist, dass die Ereignisse nur an der ersten untergeordneten Komponente hergestellt. Als nächstes habe ich versucht, auf jedem der untergeordneten Komponenten getrennt Zuhörer zu setzen, um zu sehen, ob das funktionieren würde, aber es handelte das gleiche.

So scheint es, dass die Android nur insgesamt zwei Benutzereingaben unterstützt, wenn sie mit Eingaben vom Benutzer zu tun um den Bildschirm zu berühren.

Ist das wahr? Es scheint, von der Prüfung und Forschung, dass dies der Fall ist.

Hat jemand ran in diese Einschränkung. Irgendwelche kluge Arbeit arounds?

Vielen Dank für Ihre Zeit und Antworten.

dk

War es hilfreich?

Lösung

Die Zahl der Berührungspunkte unterstützt wird, ist abhängig von dem Gerät. In allen derzeit verfügbaren Versionen von Android MotionEvents auf eine einzige Zielansicht und beschreibt den Status aller derzeit aktiven Berührungspunkte gesendet. Die Zielansicht wird bestimmt durch, wo das erste MotionEvent.ACTION_DOWN Ereignis eintritt.

Sehen Sie die Post Making Sense of Multi-Touch auf dem Android-Entwickler für einen schnellen Überblick Blog mit Multi-Touch-Ereignissen auf Android zu arbeiten.

Andere Tipps

Ich schrieb eine sehr einfache Anwendung zu testen mehr Touch auf meinem HTC Incredible Telefon. Ich verhalte mich ziemlich wie ich dachte, und so ziemlich wie die von adamp angegebenen URL. Meine Ergebnisse sind, dass das Telefon nur zwei Fingereingaben umgehen kann. Ich habe für Feld, dass jeder seine eigenen OnTouchListener hat. Wenn ich jede Box klicken drucke ich für jeweils einen Text aus. Ein Klick auf jedes Events berühren aber mit meinem Zeigefinger klickte ich irgendwo auf dem Bildschirm ich zwei Zeiger bekam. Von der Motion event.getPointerCount Methode. Hat keine Rolle, wo der zweite Finger gelandet. Könnte außerhalb der ursprünglichen Ansicht gewesen, der den ersten Finger nach unten Ereignis empfangen. Sowieso hier ist der Code, wenn Sie es sich gerne versuchen.

Ich habe eine 7z des gesamten Projektes, aber ich glaube nicht, dass ich es anbringen kann.

So, hier ist die Haupttätigkeit und die xml für das Layout.

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

    }
}

Layout:

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

Viel Glück, und wenn Sie versuchen, es lassen Sie mich wissen, wenn Sie die GOT DREI POINTERS bekommen !! drucken Aussagen. Ich frage mich, was Telefone unterstützt.

Danke, dk

editiert ich @dakira Antwort. Hier ist die mein Beispielcode:

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

Hier ist JAVA-Code:

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

Hope dies viele Personen Problem lösen:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top