Отключить или запретить мультитач в действии
У меня есть несколько видов активности, которые пользователь хочет быстро коснуться, и я фиксирую эти штрихи с помощью TouchListener
и обработки MotionEvent.ACTION_DOWN
. Однако, если пользователь использует две руки, очень вероятно, что следующий вид будет "Touch" до того, как пользователь вытащит предыдущий палец вверх. В этом случае a MotionEvent.ACTION_MOVE
запускается для первого представления, а не для желаемого MotionEvent.ACTION_DOWN
для второго представления.
Есть ли способ обойти это или предотвратить такое поведение? Я попытался отправить новое событие с помощью MotionEvent.ACTION_UP
, а также удалить прослушиватель событий, но ни один из них не работает.
Ответы
Ответ 1
Лучший способ обойти этот сценарий - использовать ViewGroup
и внедрить метод onInterceptTouchEvent
, чтобы вручную маршрутизировать события касания по вашему усмотрению.
Первоначально здесь был дан ответ:
Android мультитач! взломать кого-нибудь?
Код, реализующий это решение (найденный в разделе комментариев ответа на указанный выше вопрос), можно найти здесь:
http://pastebin.com/hiE1aTCw
Ответ 2
Самый простой способ заставить одно касание по всему приложению установить его с помощью темы:
<style name="MyTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:windowEnableSplitTouch">false</item>
<item name="android:splitMotionEvents">false</item>
</style>
манифеста:
<application
android:label="@string/app_name"
android:theme="@style/MyTheme" >
Ответ 3
Я сделал это вот так:
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if(event.getPointerCount() > 1) {
System.out.println("Multitouch detected!");
return true;
}
else
return super.onTouchEvent(event);
}
Я думаю, что вы можете переопределить onTouchEvent для любого вида.
Ответ 4
Если кто-то все еще ищет лучшее решение,
введите в xml следующий код:
android:splitMotionEvents = false
Ответ 5
Я решил это с помощью специального метода, который я не хотел делать. Если кто-нибудь найдет лучший способ, я бы хотел услышать об этом. Спасибо:
public static void setViewGroupEnebled(ViewGroup view, boolean enabled)
{
int childern = view.getChildCount();
for (int i = 0; i< childern ; i++)
{
View child = view.getChildAt(i);
if (child instanceof ViewGroup)
{
setViewGroupEnebled((ViewGroup) child,enabled);
}
child.setEnabled(enabled);
}
view.setEnabled(enabled);
}
Ответ 6
Переопределить dispatchTouchEvent и перехватить все касания там, для всех множественных касаний указатель содержит более одного.
if(ev.getPointerCount() > 1)
{
Log.d("Multitouch detected!");
ev.setAction(MotionEvent.ACTION_CANCEL);
}
Это отменяет касания и очищает нажатое состояние кнопок без каких-либо дальнейших действий.
Ответ 7
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) {
horizentalLinearGridItem.setMotionEventSplittingEnabled(false);
}
Здесь horizentalLinearGridItem - это представление parentLayout, где мы вставляем дочерние представления.
В моем коде LinearLayout. В этом LinearLayout я добавил дочерние представления. Но когда я дважды щелкнул два дочерних представления, оба получили события. Чтобы заблокировать это, я использовал приведенный выше код.
Ответ 8
Я получил его для работы, просто добавив код в метод OnTouchEvent
,
boolean action_down_required = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
if(event.getPointerCount() > 1){
action_down_required = true;
return true;
}
if(action_down_required){
action = MotionEvent.ACTION_DOWN;
}
switch (action) {
case MotionEvent.ACTION_DOWN:
// your code goes here...
action_down_required = false;
break;
// Other events...