Что означает логическое значение, возвращаемое из метода обработки события в Android

в android большинство методов прослушивателя событий возвращают логическое значение. Что означает это значение true/false ? к чему это приведет в последующих событиях ?

class MyTouchListener implements OnTouchListener {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        logView.showEvent(event);
        return true;
    }
}

относительно приведенного выше примера, если вернуть true в onTouch метод, я обнаружил, что каждое событие касания (вниз, вверх, движение и т. д.) было захвачено в соответствии с моим logView. Напротив, если return false, только событие DOWN было захвачено. Таким образом, кажется, что return false предотвратит событие распространяться. Я прав ?

кроме того, в OnGestureListener, многие методы также должны возвращать логическое значение. Имеют ли они одинаковое значение ?

6 ответов


если вы возвращаете true с ACTION_DOWN событие вас интересуют остальные события в этот жест. А "жест" в данном случае означает все события до самого финала ACTION_UP или ACTION_CANCEL. Возвращение false С ACTION_DOWN означает, что вы не хотите, чтобы событие и другие представления имели возможность обрабатывать его. Если у вас есть перекрывающиеся представления, это может быть представление sibling. Если нет, он будет пузыриться до родителя.


из документации : http://developer.android.com/reference/android/view/View.OnTouchListener.html#onTouch(android.view.Viewандроид.вид.MotionEvent)

"True, если прослушиватель потребил событие, false в противном случае."

Если вы возвращаете true, событие обрабатывается. Если false, он перейдет на следующий уровень вниз.


логическое значение определяет, используется событие или нет.

Да, вы правы. Если вы возвращаете false, следующий прослушиватель обрабатывает событие. Если он возвращает true, событие потребляется слушателем и не отправляется следующему методу.


Я потерял почти один день в устранении неполадок, но я узнал, что моя функция onTouch вызывается 2 раза при использовании true и 1 раз при использовании false.


все выше ответ правильный, но результат отличается, если представление clickable или clickable

пример, у меня есть LinearLayout содержится 1 Button и 1 TextView такой

<LinearLayout
    android:id="@+id/linearlayout_root"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0aa"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="40dp"
        android:text="Button Click"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/textview_click"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="40dp"
        android:text="TextView Click"
        android:textSize="20sp"
        android:background="#e4e4e4"
        />

</LinearLayout>

в деятельности у меня есть код, как

class MainActivity : AppCompatActivity() {
    val TAG = "TAG"

    @SuppressLint("ClickableViewAccessibility")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<LinearLayout>(R.id.linearlayout_root).setOnTouchListener { v, event ->
            Log.i(TAG, "LinearLayout onTouch event " + getDisplayAction(event.action))
            false
        }

        findViewById<Button>(R.id.button_click).setOnTouchListener { v, event ->
            Log.i(TAG, "Button onTouch event " + getDisplayAction(event.action))
            false
        }

        findViewById<TextView>(R.id.textview_click).setOnTouchListener { v, event ->
            Log.i(TAG, "TextView onTouch event " + getDisplayAction(event.action))
            false
        }
    }

    private fun getDisplayAction(action: Int): String {
        return when (action) {
            MotionEvent.ACTION_DOWN -> "DOWN"
            MotionEvent.ACTION_MOVE -> "MOVE"
            MotionEvent.ACTION_UP -> "UP"
            MotionEvent.ACTION_CANCEL -> "CANCEL"
            MotionEvent.ACTION_OUTSIDE -> "OUTSIDE"
            else -> "UNKNOWN"
        }
    }
}

корпус 1 Linear onTouch return **FALSE**, Button onTouch return **FALSE**, TextView onTouch return **FALSE**

нажать на кнопку

I/TAG: Button onTouch eventDOWN
I/TAG: Button onTouch eventMOVE
I/TAG: Button onTouch eventUP

нажмите на Поле TextView

TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN

нажмите на LinearLayout

TAG: LinearLayout onTouch eventDOWN

корпус 2 Linear onTouch return **FALSE**, Button onTouch return **TRUE**, TextView onTouch return **TRUE**

нажать на кнопку

Similar to case 1

нажмите на TextView

TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP

нажмите на LinearLayout

Similar to case 1

корпус 3 Linear onTouch return **TRUE**, Button onTouch return **FALSE**, TextView onTouch return **FALSE**

нажмите на Кнопка

Similar to case 1

нажмите на TextView

TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP

нажмите на LinearLayout

TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP

Примечание

  • по умолчанию TextView is not clickable, он станет кликабельным, если мы установим android:clickable="true" в xml или когда мы ставим textView.setOnClickListener(...)
  • при отладке, event MOVE может вызвать больше, чем мой журнал (он основан на том, как вы tap)

резюме

  • onTouch возвращение true или представления clickable , View получит все onTouchEvent
  • onTouch возвращение false и не clickable, вид не получить следующий onTouchEvent (это родитель может получить его)

надеюсь, что это поможет
демо


с Android-документ:

Примечание: Android сначала вызовет обработчики событий, а затем соответствующие обработчики по умолчанию из определения класса. Таким образом, возврат true из этих прослушивателей событий остановит распространение события на другие прослушиватели событий, а также заблокирует обратный вызов обработчика событий по умолчанию в представлении. Поэтому убедитесь, что вы хотите завершить событие, когда вы вернете true.