OnTouchListener ACTION_MOVE не работает при перемещении пальца по экрану - PullRequest
2 голосов
/ 10 июля 2020

Вот что я хочу:

  1. Прикоснитесь к экрану.
  2. продолжайте двигать пальцем.
  3. Если коснуться любой кнопки на экране, двигая пальцем, цвет кнопки изменится на зеленый.

Проблема : условие 'if' не работает в 57-й строке (. java)

if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) , пока оно не изменится на if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) , что я не Не хочу.

Пожалуйста, посмотрите. java файл ниже:

public class MainActivity extends AppCompatActivity implements View.OnTouchListener , GestureDetector.OnGestureListener{

    private Button bt1,bt2,bt3
    
    private GestureDetector mGestureDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        // ------ buttons findViewByID
      
            bt1 = (Button) findViewById(R.id.b1);
            bt2 = (Button) findViewById(R.id.b2);
            bt3 = (Button) findViewById(R.id.b3);  
       

        //------Set UP id for buttons    

            bt1.setId(1);
            bt2.setId(2);
            bt3.setId(3);
        
       //-------set up touchlisteners for buttons
        
            bt1.setOnTouchListener(this);
            bt2.setOnTouchListener(this);
            bt3.setOnTouchListener(this);
    
        //
        mGestureDetector = new GestureDetector(this,this);

    }
    //---------Override Event
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
    
       /*----------When finger  touched + finger is moving. But the  condition below is not working  finger moving event (ACTION_MOVE) not working. but finger touch event(ACTION_DOWN) is working*/
        if (motionEvent.getAction() == MotionEvent.ACTION_MOVE)   // condition doesn't work until it changes                                //if(motionEvent.getAction() == MotionEvent.ACTION_DOWN).
        {
                switch (view.getId())
                    {
                    case 1:
                        bt1.setBackgroundColor(GREEN);
                        break;
                    case 2:
                        bt2.setBackgroundColor(GREEN);
                        break;
                    case 3:
                        bt3.setBackgroundColor(GREEN);
                        break;
                    }
                            
        }

            return true;
                }
//--------Other Overrides
    @Override
    public boolean onDown(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent motionEvent) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent motionEvent) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {

        return false;
    }

    @Override
    public void onLongPress(MotionEvent motionEvent) {

    }

    @Override
    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
        return false;
    }

 
 
 }

И, пожалуйста, посмотрите файл. XML ниже

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

        tools:context=".MainActivity">
        
        //------Mode: HORIZONTAL
    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            // ------ BUTTONS
        <Button
                android:id="@+id/b1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="60sp"
                android:layout_weight="1"/>
        <Button
                android:id="@+id/b2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="60sp"
                android:layout_weight="1" />
        <Button
                android:id="@+id/b3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="60sp"
                android:layout_weight="1"/>
    </LinearLayout>
    
</LinearLayout>

1 Ответ

2 голосов
/ 10 июля 2020

Это потому, что, когда вы устанавливаете onTouchListener на кнопках и сначала начинаете движение по событию касания контейнера (LinearLayout), оно не передается дочернему элементу (button). Чтобы он работал, вам нужно установить слушателя в контейнере, а затем проверить, содержатся ли координаты касания в прямоугольнике кнопок.

Код:

private Button bt1, bt2, bt3;
private LinearLayout lin;
private GestureDetector mGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // ------ buttons findViewByID
    bt1 = (Button) findViewById(R.id.b1);
    bt2 = (Button) findViewById(R.id.b2);
    bt3 = (Button) findViewById(R.id.b3);
    lin = findViewById(R.id.lin);
    //-------set up touchlisteners for buttons
    lin.setOnTouchListener(this);
    //
    mGestureDetector = new GestureDetector(this, this);
}

@Override
public boolean onTouch(View view, MotionEvent motionEvent)
{
    if (motionEvent.getAction() == MotionEvent.ACTION_MOVE)
    {
        Rect but1 = new Rect();
        bt1.getHitRect(but1);
        if (but1.contains((int) motionEvent.getX(), (int) motionEvent.getY()))
        {
            bt1.setBackgroundColor(getColor(R.color.colorAccent));
            return true;
        }
        Rect but2 = new Rect();
        bt2.getHitRect(but2);
        if (but2.contains((int) motionEvent.getX(), (int) motionEvent.getY()))
        {
            bt2.setBackgroundColor(getColor(R.color.colorAccent));
            return true;
        }
        Rect but3 = new Rect();
        bt3.getHitRect(but3);
        if (but3.contains((int) motionEvent.getX(), (int) motionEvent.getY()))
        {
            bt3.setBackgroundColor(getColor(R.color.colorAccent));
            return true;
        }
    }
    return true;
}

Я тестировал это код, и он работает нормально. Конечно, вы можете сделать это лучше, когда у вас есть 200 кнопок, будет лучше загружать прямоугольники в onCreate(), чем создавать их каждый раз в событии касания

...