Puis-je obtenir la valeur de motionEvent.getrawx () / getrawy () d'autres pointeurs? P>
5 Réponses :
En effet, l'API ne permet pas de le faire, mais vous pouvez le calculer. Essayez que:
public boolean onTouch(final View v, final MotionEvent event) { int rawX, rawY; final int actionIndex = event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT; final int location[] = { 0, 0 }; v.getLocationOnScreen(location); rawX = (int) event.getX(actionIndex) + location[0]; rawY = (int) event.getY(actionIndex) + location[1]; }
@Gilsh L'implémentation suivante fonctionnera si la vue est tournée: Stackoverflow.com/a/45702575/1012409
Ce n'est peut-être pas suffisant pour simplement déplacer les coordonnées locales par emplacement de la vue si la vue est tournée. Dans ce cas, vous avez besoin de quelque chose comme ceci:
void getRowPoint(MotionEvent ev, int index, PointF point){ final int location[] = { 0, 0 }; getLocationOnScreen(location); float x=ev.getX(index); float y=ev.getY(index); double angle=Math.toDegrees(Math.atan2(y, x)); angle+=getRotation(); final float length=PointF.length(x,y); x=(float)(length*Math.cos(Math.toRadians(angle)))+location[0]; y=(float)(length*Math.sin(Math.toRadians(angle)))+location[1]; point.set(x,y); }
Le Si vous regardez la mise en œuvre de malheureusement, bien sûr, le puis j'ai utilisé getLocationVoiscreen code> La réponse fonctionne la plupart du temps, mais je voyais que cela renvoie des valeurs incorrectes parfois (lorsque je repositionnais et relancement de la vue pendant que l'événement tactile a eu lieu), donc je a trouvé une approche alternative qui fonctionne plus de manière fiable.
gettrawx code>, il appelle une fonction native privée qui accepte un
pointerindex code>, mais le
MotionEvent code> l'appelle uniquement avec index 0: p>
natifgetrawaxisvalue code> est privé, mais vous pouvez pirater ce Utiliser la réflexion pour vous donner accès à tout ce dont vous avez besoin. Voici ce que le code ressemble à: p>
motionEvent code> ne sont pas documentés, cette approche peut donc collecter des versions passées ou futures. du SDK, mais il semble fonctionner pour moi. p>
mnatifptr code> et le
natifptr < / Code> Param modifié à partir de
int code> à
long code> dans le niveau d'API 20, donc si vous ciblez le niveau d'API 19 ou précédent, le code ci-dessus s'écrasera car
getdeclaredmethod code> ne trouvera rien. Pour résoudre ce problème dans mon code, je viens de récupérer la méthode par nom au lieu de la signature de type complète, qui arrive à fonctionner dans ce cas. Il n'y a pas de moyen de rechercher directement des méthodes avec un nom donné, donc je me suis effacée par les méthodes déclarées à l'unité initiale statique et a sauvegardé la correspondance à un champ statique. Voici le code: p>
natif_get_raw_axis_value code> à la place du
getrawaxisvaluemethod code> dans le code ci-dessus. P > p>
Une solution qui convient la peine d'essayer pour la plupart des cas d'utilisation consiste à ajouter ceci à la première ligne du Ontouchevent CODE> Il trouve simplement la différence entre le brut et le traitement et déplace l'emplacement de l'événement MotionEvent, par cette somme. De sorte que toutes les valeurs GetX (int) sont maintenant les valeurs brutes. Ensuite, vous pouvez réellement utiliser les choses getx () gety () comme les valeurs brutes.
event.offsetLocation(event.getRawX()-event.getX(),event.getRawY()-event.getY());
Une solution beaucoup plus simple que les autres et surcharger sur la surcharge sur ONDRAW (). En essayant de cartographier les points de touche à une vue transformée est une recette des maux de tête.
Vous êtes monsieur, sont un dieu réel, Tatarize! Cette solution nous a sauvés des jours de douleur que nous n'avions pas pu résoudre. J'aimerais pouvoir uppoter plus!
Il n'y a pas d'API pour obtenir le précision du pointeur RAWX et RAWY. Mais vous pouvez calculer des valeurs similaires en ce qui concerne la position de la vue au parent et à sa rotation. Au cas où la vue du parent occupe l'ensemble de la zone tactile que vous essayez de manipuler, l'utilisation de matrix vous aidera à résoudre votre problème:
private float[] calcRawCoords(MotionEvent event, int pointerIndex) { Matrix screenMatrix = new Matrix(); screenMatrix.postRotate(getRotation(), mPivotX, mPivotY); screenMatrix.postTranslate(getLeft(), getTop()); float viewToScreenCoords[] = {event.getX(pointerIndex), event.getY(pointerIndex)}; screenMatrix.mapPoints(viewToScreenCoords); return viewToScreenCoords; }