Отключить или запретить мультитач в действии
у меня есть несколько представлений о деятельности, которую пользователь хочет быстро коснуться последовательно, и я фиксирую эти прикосновения с помощью TouchListener
и обращении MotionEvent.ACTION_DOWN
. Однако, если пользователь использует две руки, очень вероятно, что следующий вид будет "прикоснуться", прежде чем пользователь потянет предыдущий палец вверх. В этом случае MotionEvent.ACTION_MOVE
запускается для первого просмотра, а не для желаемого MotionEvent.ACTION_DOWN
второй вид.
есть ли способ обойти или предотвратить такое поведение? Я пробовал отправить новое событие с помощью MotionEvent.ACTION_UP
а также удаление прослушивателя событий, но ни один из них не работает.
8 ответов
самый простой способ заставить одно касание по всему приложению-установить его с помощью темы:
<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" >
если кто-то еще ищет лучшее решение, поместите в xml следующий код:
android:splitMotionEvents = false
Я сделал это так:
@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 для любого представления.
лучший способ обойти этот сценарий-использовать ViewGroup
и реализовать onInterceptTouchEvent
метод для ручной маршрутизации событий касания, как вы считаете нужным.
первоначально ответ был дан здесь: Android мультитач! взломать кого-нибудь?
код, реализующий это решение (находится в разделе комментариев ответа на вышеуказанный вопрос), находится здесь: http://pastebin.com/hiE1aTCw
Я решил это с помощью пользовательского метода , который я не хотел делать, если кто-нибудь найдет лучший способ, я хотел бы услышать об этом спасибо:
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);
}
переопределить dispatchTouchEvent и перехватить все касания там, для всех нескольких касаний pointercount больше одного.
if(ev.getPointerCount() > 1)
{
Log.d("Multitouch detected!");
ev.setAction(MotionEvent.ACTION_CANCEL);
}
это отменяет касания и очищает нажатое состояние кнопок без каких-либо дальнейших действий.
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) {
horizentalLinearGridItem.setMotionEventSplittingEnabled(false);
}
здесь horizentalLinearGridItem-это представление parentLayout, в которое мы вставляем дочерние представления. В моем коде его краю. В этом LinearLayout я добавил дочерние представления. Но когда я щелкнул два дочерних представления одновременно, оба получили события. Чтобы заблокировать это, я использовал приведенный выше код.
Я заставил его работать на меня, просто добавив код в 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...