Android Zwei Buttons gleichzeitig drücken

Nametat

Mitglied
Hallo 🙂

Ich hab da eine kurze Frage:

Ich hab neulich mit dem Android programming angefangen und habe durch eine kurze Spielidee versucht zwei Buttons gleichzeitig zu drücken, also grundsätzlich soll ein Button für Spieler A eine Nummer A erhöhen und für Spieler B eine Nummer B. Wer als erstes 100 erreicht hat, hat gewonnen.

Nun meine Frage:
Gibt es eine Möglichkeit die Buttons in evtl getrennten Threads zu klicken, sodass für jeden ein Label hochzählt bzw ein Integer für das Label hochzählt?
Ist es überhaupt möglich zwei Buttons gleichzeitig zu drücken?

Ich programmiere auf dem OneplusOne und mit Netbeans auf Android 4.4.3 ( 19 glaube ich? ).

Danke schon mal im Voraus!
 
Das scheint mir logisch 🙂

Aber wie bearbeiten die beiden Buttons dann ihre Aufgaben?
In meinem Fall MÜSSEN sie es parallel machen, da die Spieler ja gegeneinander spielen.
 
Hat denn noch nie jemand dieses Problem bei einem Multiplayer spiel auf einem Gerät gehabt?
Die ganzen Reaktionsspiele basieren doch auch auf dem Prinzip oder nicht?
 
Es reicht ja, wenn du beiden Buttons OnClickListener setzt, die die gewünschte Aufgabe erledigen.
Eine "Parallelität" musst du nicht selbst hinzufügen.
 
Nein, es reicht leider nicht aus 🙁

Da wenn die beiden Spieler gleichzeitig auf die Buttons drücken ein Wert nicht hochzählt.

Also ich brauche etwas, das wenn die Buttons gleichzeitig gedrückt werden auch gleichzeitig eine Aufgabe erledigt wird.
Sowas wie Zwei Threads, die halt parallel ablaufen.
 
Ich glaube, dass Android bei normalen Listenern die Events nicht weiterreicht (der erkennt nur einen "ein-Finger-Klick" auf dem Button), wenn man an mehreren Stellen klickt. Ich denke, du musst einen TouchListener auf einem (Transparenten?) Layer dadrüber machen und dann berechnen, ob du innerhalb der Buttons geklickt hast und dann entsprechend die Labels aktualisieren. Was anderes würde mir spontan nicht einfallen.
 
Also, ich habs jetzt hinbekommen, dass er das gleichzeitig macht undzwar mit einem transparenten Textview über der kompletten "App".
Nun ist das Problem, dass er nur bei ACTION_MOVE die beiden Pointer erkennt.

Hier mal meine main.xml:

Code:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
    >
    
    <LinearLayout
        android:id="@+id/linearlayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        >

        <TextView
            android:id="@+id/txtPlayer1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/textviewtext"
        />

        <Button 
            android:id="@+id/btnPlayer1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/buttontext"
        />

        <TextView
            android:id="@+id/txtPlayer2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/textviewtext"
        />

        <Button
            android:id="@+id/btnPlayer2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/buttontext"
        />
    </LinearLayout>
    
    <TextView
        android:id="@+id/txtTransparent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    />
    
</FrameLayout>

Und hier meine MainActivity.java

Java:
public class MainActivity extends Activity {

    private Button btnPlayer1;
    private TextView txtPlayer1;
    private int iPlayer1 = 0;
    private Button btnPlayer2;
    private TextView txtPlayer2;
    private int iPlayer2 = 0;
    private MyOnTouchListener myOnTouchListener;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Log.d("MainActivity", "--------New Start----------");

        myOnTouchListener = new MyOnTouchListener();

        TextView v = (TextView) findViewById(R.id.txtTransparent);
        v.setOnTouchListener(myOnTouchListener);

        btnPlayer1 = (Button) findViewById(R.id.btnPlayer1);
        txtPlayer1 = (TextView) findViewById(R.id.txtPlayer1);

        btnPlayer2 = (Button) findViewById(R.id.btnPlayer2);
        txtPlayer2 = (TextView) findViewById(R.id.txtPlayer2);

    }

    public class MyOnTouchListener implements View.OnTouchListener {
        
        public boolean onTouch(View v, MotionEvent event) {
            int pointerCount = event.getPointerCount();

            for (int i = 0; i < pointerCount; i++) {
                Log.d("MainActivity", "Counter:" + pointerCount);
                Log.d("MainActivity", "X:" + event.getX());
                Log.d("MainActivity", "Y:" + event.getY());

                Rect rectButton1 = new Rect(btnPlayer1.getLeft(), btnPlayer1.getTop(), btnPlayer1.getRight(), btnPlayer1.getBottom());
                if (rectButton1.contains((int) event.getX(i), (int) event.getY(i))) {
                    txtPlayer1.setText(++iPlayer1 + "");
                    Log.d("MainActivity", "Button 1 clicked:" + iPlayer1);
                }
                
                Rect rectButton2 = new Rect(btnPlayer2.getLeft(), btnPlayer2.getTop(), btnPlayer2.getRight(), btnPlayer2.getBottom());
                if (rectButton2.contains((int) event.getX(i), (int) event.getY(i))) {
                    txtPlayer2.setText(++iPlayer2 + "");
                    Log.d("MainActivity", "Button 2 clicked:" + iPlayer2);
                }
            }

            return true;
        }
    }

Momentan ist es so, dass wenn man auf die Buttons klickt, und in dem Button gedrückt hält, der jeweilige Zähler super schnell hochzählt.
Nun möchte ich, dass aber nur 1 pro Klick hochgezählt wird.

Habt ihr da ein paar Ideen oder Ansätze, wie man das am besten Implementieren kann?
Wäre auch nett, wenn Ihr euch mal den vorhandenen Code auf Verbesserungen anschauen könntet 🙂

Vielen Dank schon mal im Voraus!
 
Ich weiss nicht, ob das was bringt, aber was ist, wenn du #ACTION_POINTER_DOWN/UP verwendest? MOVE ist, denke ich mal, per Definition nicht geeignet für ein "Klick"-Event. Da musst du schon mit den #ACTION_POINTER_DOWN/UP arbeiten...

Nur ein Verbesserungsvorschlag: Ich verwende für Transparente Layer eigentlich immer FrameLayouts mit transparenten Background...
 

Neue Themen


Zurück
Oben