Je veux jouer une animation lorsque l'utilisateur clics o balayage . Mais pouvons-nous gérer les deux comportements dans MotionLayout ? Ils fonctionnent parfaitement séparément, mais si j'ajoute OnClick y OnSwipe dans la même scène, seulement OnClick fonctionne. Existe-t-il des solutions de contournement ?
Réponses
Trop de publicités?Oui, vous pouvez contourner ce problème en supprimant le comportement onClick de votre MotionScene et en implémentant vous-même le clic en étendant le MotionLayout et en surchargeant le comportement onClick. dispatchTouchEvent
.
Dans cette fonction, vous décidez si l'événement tactile est un clic dans la "zone cible" où vous voulez que le comportement onClick se produise.
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (touchEventInsideTargetView(clickableArea, ev)) {
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
startX = ev.x
startY = ev.y
}
MotionEvent.ACTION_UP -> {
val endX = ev.x
val endY = ev.y
if (isAClick(startX!!, endX, startY!!, endY)) {
if (doClickTransition()) {
return true
}
}
}
}
}
return super.dispatchTouchEvent(ev)
}
Un article sur ce sujet et un exemple de code complet sont disponibles ici : https://medium.com/vrt-digital-studio/picture-in-picture-video-overlay-with-motionlayout-a9404663b9e7
Bien sûr, il suffit de gérer l'événement onTouch dans votre classe parent. Puis décidez de ce que vous allez en faire et à quoi l'envoyer.
onTouch(touchEvent){
motionLayout.doClickIfYouWant(touchEvent)
motionLayout.doSwipeIfYouWant(touchEvent)
}
Pseudo-code, mais vous pouvez l'envoyer aux deux si vous l'attrapez en premier et décidez qui l'aura. N'oubliez pas non plus de renvoyer le drapeau booléen manipulé à partir du callback onTouch pour vous assurer qu'il ne sera pas manipulé deux fois. Enfin, si d'autres éléments sont touchables à l'écran, vous devrez peut-être vérifier les valeurs x et y de votre toucher pour déterminer s'il doit être envoyé au motionLayout ou simplement renvoyer "non traité" et laisser le comportement natif transmettre le toucher.
J'espère que cela vous aidera. De plus, si la classe motionLayout n'expose pas les méthodes dont vous avez besoin pour envoyer l'événement tactile correct à plusieurs endroits, vous pouvez toujours les obtenir en utilisant la réflexion. Bien sûr, la réflexion peut être un peu plus lente, donc à utiliser avec précaution, mais j'ai déjà eu à le faire pour une classe de mise en page qui avait des images enfants que je devais déplacer, et contrôlait le toucher à un niveau parent pour décider si l'image est touchée ou non, mais ce n'était pas disponible publiquement, donc j'ai regardé le code et l'ai touché via la réflexion sans aucun problème. Considérez cela comme un dernier recours, et peut-être que tout ce dont vous avez besoin est exposé.
Sachez également que certains ingénieurs méprisent la réflexion, alors codez avec prudence.