#android #touch #android-touch-event
#Android #прикосновение #android-сенсорное событие
Вопрос:
Я пытаюсь разобраться в том, как Android обрабатывает события касания, и я запутался в этом. Из того, что я знаю, если onTouch()
для события элемента представления установлено значение true, это означает, что элемент готов обработать это событие касания, т. Е. Он Использует событие касания.
Если это так, то в приведенном ниже фрагменте кода после запуска блокировка, когда она вернула значение true, не позволила нам изменить выбор радиогруппы
, я уверен, это потому, что я не слишком знаком с тем, как работают события Android touch. Может кто-нибудь, пожалуйста, обобщите это правильно для меня. И объясните, почему возврат true
к onTouch()
событиям не позволил нам выбрать новый элемент.
package com.examples.customtouch;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.CheckBox;
/**
* Created by Dave Smith
* Double Encore, Inc.
* Date: 9/25/12
* TouchListenerActivity
*/
public class TouchListenerActivity extends Activity implements View.OnTouchListener {
/* Views to display last seen touch event */
CheckBox mLockBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.touch_listener);
mLockBox = (CheckBox) findViewById(R.id.checkbox_lock);
findViewById(R.id.selection_first).setOnTouchListener(this);
findViewById(R.id.selection_second).setOnTouchListener(this);
findViewById(R.id.selection_third).setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
/*
* Consume the events here so the buttons cannot process them
* if the CheckBox in the UI is checked
*/
return mLockBox.isChecked();
}
private String getNameForEvent(MotionEvent event) {
String action = "";
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
action = "ACTION_DOWN";
break;
case MotionEvent.ACTION_CANCEL:
action = "ACTION_CANCEL";
break;
case MotionEvent.ACTION_MOVE:
action = "ACTION_MOVE";
break;
case MotionEvent.ACTION_UP:
action = "ACTION_UP";
break;
default:
return null;
}
return String.format("%sn%.1f, %.1f", action, event.getX(), event.getY());
}
}
XML-файл действия
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<CheckBox
android:id="@ id/checkbox_lock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Lock Selection" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@ id/selection_first"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="First"/>
<RadioButton
android:id="@ id/selection_second"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Second"/>
<RadioButton
android:id="@ id/selection_third"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Third"/>
</RadioGroup>
</LinearLayout>
Пожалуйста, обратите внимание, что этот фрагмент кода взят из проекта Дэйва Смита под названием Custom Touch Examples
Ответ №1:
Из документации по адресу https://developer.android.com/reference/android/view/View .OnTouchListener.html , возвращение true
из onTouch
указывает на то, что event
продукт был израсходован. Хотя я не уверен на 100%, я считаю, что оно не должно распространяться на другие элементы в иерархии, и поэтому событие не будет передано трем RadioButton
элементам в макете, что означает, что они не будут уведомлены о каких-либо касаниях.
Этот onTouch
метод служит двум целям: позволяет выполнять пользовательскую логику для этого события и указывать, следует ли передавать событие другим обработчикам через возвращаемое значение.