Как использовать View.OnTouchListener вместо onClick
Я разрабатываю приложение для Android 2.2.2 для клиента, и он хочет сделать следующее:
Теперь у меня есть кнопка с событием onClick, но он не нравится, он хочет отреагировать, когда пользователь отпустит кнопку.
Я нашел View.OnTouchListener, который, я думаю, это то, что мне нужно использовать, но есть ли возможность добавить это событие в xml, как я сделал с OnClick?
<ImageButton
android:id="@+id/btnSaveNewGate"
android:layout_width="@dimen/btnSaveNewGate_width"
android:layout_height="@dimen/btnSaveNewGate_height"
android:layout_below="@+id/radioGrGateType"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/btnSaveNewGate_marginTop"
android:background="@null"
android:contentDescription="@string/layout_empty"
android:onClick="onSaveNewGateClick"
android:scaleType="fitXY"
android:src="@drawable/save_gate_selector" />
У меня есть еще два вопроса:
Какое событие ассоциировано, когда пользователь отпускает свой палец?
Есть ли какие-либо рекомендации, запрещающие использование View.OnTouchListener
вместо onClick
?
Ответы
Ответ 1
Событие, когда пользователь отпускает палец, MotionEvent.ACTION_UP
. Я не знаю, есть ли какие-либо рекомендации, запрещающие использование View.OnTouchListener вместо onClick(), скорее всего, это зависит от ситуации.
Вот пример кода:
imageButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
// Do what you want
return true;
}
return false;
}
});
Ответ 2
Предположительно, если вы хотите использовать OnTouchListener
, а не OnClickListener
, тогда необходимы дополнительные функции OnTouchListener
. Это дополнительный ответ, чтобы показать более подробную информацию о том, как можно использовать OnTouchListener
.
Определить слушателя
Поместите это где-нибудь в свою деятельность или фрагмент.
private View.OnTouchListener handleTouch = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("TAG", "touched down");
break;
case MotionEvent.ACTION_MOVE:
Log.i("TAG", "moving: (" + x + ", " + y + ")");
break;
case MotionEvent.ACTION_UP:
Log.i("TAG", "touched up");
break;
}
return true;
}
};
Установить прослушиватель
Установите слушателя в onCreate
(для Activity) или onCreateView
(для фрагмента).
myView.setOnTouchListener(handleTouch);
Примечания
-
getX
и getY
дают вам координаты относительно вида (то есть левый верхний угол представления). Они будут отрицательными при перемещении вверх или слева от вашего вида. Используйте getRawX
и getRawY
, если вы хотите абсолютные координаты экрана.
- Вы можете использовать значения
x
и y
для определения таких вещей, как направление прокрутки.
Ответ 3
OnClick запускается, когда пользователь отпускает кнопку. Но если вы все еще хотите использовать TouchListener, вам нужно добавить его в код. Это просто:
myView.setOnTouchListener(new View.OnTouchListener()
{
// Implementation;
});
Ответ 4
для использования образца сенсорного прослушивателя просто вам нужен этот код
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, null, 0);
return true;
}