onInterceptTouchEvent, onTouchEvent seulement voir ACTION_DOWN
J'ai un haut niveau de ViewGroup, que j'appelle SliderView, dans laquelle je veux détecter le balayage. C'est surtout le travail, mais bizarre le problème persiste.
L'essence de SliderView est de remplacer onInterceptTouchEvent et, une fois que l'utilisateur est en fait un balayage, renvoie "true" pour éviter que d'autres vues de voir le MotionEvent. Voici une capture de code:
public class SliderView extends ViewGroup
{
enum MoveState { MS_NONE, MS_HSCROLL, MS_VSCROLL };
private MoveState moveState = MoveState.MS_NONE;
... other code ...
public boolean onInterceptTouchEvent(MotionEvent e)
{
final int action = e.getAction();
switch (action & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
moveState = MoveState.MS_NONE;
break;
case MotionEvent.ACTION_MOVE:
if (moveState == MoveState.MS_NONE)
{
if (motion is horizontal)
{
moveState = MoveState.MS_VSCROLL;
return true;
}
else
moveState = MoveState.MS_VSCROLL; //let child window handl MotionEvent
}
else if (moveState == MoveState.MS_HSCROLL)
return true; //don't let children see motion event.
}
return super.onInterceptTouchEvent (e);
}
... other code ...
}
C'est ma compréhension que mon SliderView (ce qui est le plus éloigné de la vue) devrait toujours recevie onInterceptTouchEvent. Dans un de mes tests, le niveau supérieur de l'enfant est un Toutefois, dans le cas suivant, cela ne semble pas être.
Lorsque le niveau supérieur de l'enfant est un ScrollView, onInterceptTouchEvent obtient ACTION_MOVE et mon code fait ce que je veux. Dans un autre cas, où le niveau supérieur de l'enfant est un LinearLayout, il échoue parfois: elle obtient toujours ACTION_DOWN mais obtient ACTION_MOVE seulement si l'utilisateur touche un widget à l'intérieur de la LinearLayout; si le fait de toucher zone vide, seulement ACTION_DOWN vient à travers.
Je vais noter qu'il se comporte comme si l'échec de cas sur la touche se passe à l'extérieur de la SliderView. Cependant, si tel était le cas, pourquoi aurais-je obtenir le ACTION_DOWN événements?
Deuxième remarque: en regardant le code source pour le ScrollView, je vois la vérification du mot "inChild"; je n'ai pas compris ce que c'est et comment elle pourrait être pertinente.
non, mais en lisant plus de docs, j'ai appris il ya quelque chose appelé ViewPager, qui intègre un balayage horizontal. Je n'ai pas encore essayé car je suis rajouté d'autres choses maintenant. Je ne sais pas ce que vous cherchez à faire, mais si vous essayez ViewPager s'il vous plaît laissez-moi savoir les résultats.
OriginalL'auteur Peri Hartman | 2012-09-25
Vous devez vous connecter pour publier un commentaire.
En raison de la réponse de user123321 ici
OriginalL'auteur grine4ka
Tous vous avez besoin est d'appeler
sur la vue parent, comme ce -
donc dois-je le résoudre en fonction de votre question, serait-ce bien?
Désolé, je ne comprends pas votre question.
OriginalL'auteur Pb Studies
De Android du développeur de référence (http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)):
"2.
.... Aussi, en retournant vrai onTouchEvent(), vous ne recevrez pas les événements suivants dans onInterceptTouchEvent() et tous les traitement de la touche qui doit se produire dans onTouchEvent() comme d'habitude."
Peut-être parce que votre onTouchEvent renvoie toujours vrai..?
OriginalL'auteur Kerry
Lors de l'interception onTouchEvent, il y a deux choses à faire pour bien intercepter la touche (toutes choses étant par défaut).
Return false dans onInterceptTouchEvent()
Retourne true en onTouchEvent()
Alors, pour votre cas (et d'autres). Effectuez tous vos calculs dans le onTouchEvent() comme indiqué ci-dessus. Le onInterceptTouchEvent() est appelé une seule fois pour la ACTION_DOWN. Mais, le onTouchEvent aurez également la ACTION_DOWN événement, et vous aurez besoin de retourner la valeur true là, plutôt que le super.
Pour plus d'informations concernant onInterceptTouchEvent(): http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)
ps - Quand vous posez des questions ici, vous devriez aussi écrire la description de ce que vous essayez de faire. Vous pourriez tout à fait possible de trouver beaucoup de meilleures façons de faire les choses. Pour votre cas de la navigation, la vraie réponse que vous cherchez est ViewPager. Il fonctionne très bien et est très facile à mettre en œuvre. Vous devriez également vérifier certains autres faciliter la navigation des modèles que Android a à offrir aux développeurs: lien.
Oui, et c'est pourquoi j'ai commenté sur elle. Vous avez dit:
I haven't tried it yet as I'm fleshing out other stuff right now. I don't know what you're seeking to do, but if you try ViewPager please let me know the outcome.
Donc, je vous laisse savoir le résultat, car j'ai utilisé ViewPager. 😉 Plus de questions?Oui je l'ai essayé et il fonctionne très bien. Merci de voir stackoverflow.com/questions/13664155/...
travail, dans mon cas!
ne fonctionne pas pour moi =(
OriginalL'auteur Anonsage