首页 > 解决方案 > 一次在触摸监听器上读取 ACTION_MOVE

问题描述

我希望它与 touchlistener 在字母上形成一个单词。但是当涉及到一封信时,它会反复写那封信。我怎样才能一口气把它拿走?

所以如果把“harf1”写成单词的字母,就不会再写了。

这是代码:

linearLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {


                switch (event.getActionMasked()){
                    case MotionEvent.ACTION_DOWN:
                        if (isDownWord1(event.getX(),event.getY()))
                            yazi.setText("A");
                        if (isDownWord2(event.getX(),event.getY()))
                            yazi.setText("B");
                        if (isDownWord3(event.getX(),event.getY()))
                            yazi.setText("C");
                        if (isDownWord4(event.getX(),event.getY()))
                            yazi.setText("D");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        if (isDownWord1(event.getX(),event.getY()))
                            yazi.setText(yazi.getText().toString() + "A");
                        if (isDownWord2(event.getX(),event.getY()))
                            yazi.setText(yazi.getText().toString() + "B");
                        if (isDownWord3(event.getX(),event.getY()))
                            yazi.setText(yazi.getText().toString() + "C");
                        if (isDownWord4(event.getX(),event.getY()))
                            yazi.setText(yazi.getText().toString() + "D");
                        break;
                    case MotionEvent.ACTION_UP:
                        yazi.setText("");
                        break;
                }
                return true;
            }
        });
    }

    public boolean isDownWord1(float x,float y){
        if(x < harf1.getRight() && x > harf1.getLeft() &&  y > harf1.getTop() && y < harf1.getBottom())
        return true;
        else
          return false;
    }

    public boolean isDownWord2(float x,float y){
        if(x < harf2.getRight() && x > harf2.getLeft() &&  y > harf2.getTop() && y < harf2.getBottom())
            return true;
        else
            return false;
    }

    public boolean isDownWord3(float x,float y){
        if(x < harf3.getRight() && x > harf3.getLeft() &&  y > harf3.getTop() && y < harf3.getBottom())
            return true;
        else
            return false;
    }

    public boolean isDownWord4(float x,float y){
        if(x < harf4.getRight() && x > harf4.getLeft() &&  y > harf4.getTop() && y < harf4.getBottom())
            return true;
        else
            return false;
    }

那是 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/game_screen_bg"
    tools:context=".GameLevel1">

    <TextView
        android:id="@+id/harf1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="93dp"
        android:layout_marginLeft="93dp"
        android:layout_marginTop="475dp"
        android:text="A"
        android:textSize="50dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/harf2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="408dp"
        android:layout_marginEnd="63dp"
        android:layout_marginRight="63dp"
        android:text="B"
        android:textSize="50dp"
        app:layout_constraintEnd_toStartOf="@+id/harf3"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/harf3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="471dp"
        android:layout_marginEnd="95dp"
        android:layout_marginRight="95dp"
        android:text="C"
        android:textSize="50dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/harf4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="188dp"
        android:layout_marginRight="188dp"
        android:layout_marginBottom="114dp"
        android:text="D"
        android:textSize="50dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/yazi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="108dp"
        android:layout_marginLeft="108dp"
        android:layout_marginTop="200dp"
        android:text="TextView"
        android:textSize="50dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:id="@+id/xxxx"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#10000000"
        android:orientation="horizontal" />

</androidx.constraintlayout.widget.ConstraintLayout>

标签: javaandroidontouchlistener

解决方案


在向 追加字符之前yazi TextView,只需要检查 的最后一个字符是否yazi与新字符不同;所以将开关盒更改MotionEvent.ACTION_MOVE为:

case MotionEvent.ACTION_MOVE:
    String text = yazi.getText().toString();
    String lastChar = text.substring(text.length() - 1);
    if (isDownWord1(event.getX(), event.getY()) && !lastChar.equals("A"))
        yazi.setText(yazi.getText().toString() + "A");
    if (isDownWord2(event.getX(), event.getY()) && !lastChar.equals("B"))
        yazi.setText(yazi.getText().toString() + "B");
    if (isDownWord3(event.getX(), event.getY()) && !lastChar.equals("C"))
        yazi.setText(yazi.getText().toString() + "C");
    if (isDownWord4(event.getX(), event.getY()) && !lastChar.equals("D"))
        yazi.setText(yazi.getText().toString() + "D");
    break;

推荐阅读