Est-il possible de passer une onTouchEvent à de multiples points de vue dans Android?
J'ai lu quelques questions à ce sujet sur DONC mais je n'ai pas vraiment trouvé une réponse solide à elle.
J'ai un framelayout que je pile de plusieurs vues personnalisées, cependant la onTouch événement ne fonctionne qu'avec la vue de dessus. (les vues personnalisées sont tous le même point de vue avec la même onTouch événement, il suffit de plusieurs d'entre eux)
FrameLayout
- customView[2] <--- c'est la dernière ajoutée et la seule qui reçoit l'événement
- customView[1]
- customView[0]
Je suis en essais sur Android 2.2 et je me demande si il n'y a aucune façon pour les autres points de vue ci-dessous pour savoir où le toucher est-il arrivé?
MODIFIER (Ajout du code)
Je suis en ajoutant un peu de code, nous l'espérons aider à expliquer d'où je suis en cours d'exécution dans des questions. Au début, j'ai juste eu le onTouchEvent
return true. Cela fait en sorte que le dernier point de vue (dans mon cas customerView[2]) serait le seul à générer une valeur.
Cependant, une fois que j'ai ajouté la méthode pour définir le onTouchEvent
à retourner true ou false, maintenant la seule vue de retourner une valeur générée est customView[0].
J'espère que cela éclaircit ce que je demande. Je suis plutôt nouveau à cela et je vous remercie de prendre le temps d'expliquer (et bien sûr, je vous remercie de votre patience).
Aussi, je me rends compte que mon TextView de ne pas mettre à jour avec la valeur de chaque touchEvent, je suis en train de travailler sur la fixation de la.
Mon Activité:
public class MyActivity extend Activity {
CustomView[] customView;
TextView[] textView;
int numViews 3;
//FrameLayout and Params created
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
for(int i = 0; i < numViews; i++) {
customView[i] = new CustomView(this, i);
//Allows the onTouch to be handled by all Views - View[0] is the bottom view
if(i == 0) {
customView[i].setTouchBool(true); //set view's onTouch to return true
} else {
customView[i].setTouchBool(false); //set view's onTouch to return false
}
//Set TextView to display the number generated by the CustomView
textView[i].setText(Double.toString(customView[i].getGeneratedNumber()));
//Add views to main layout
frame.addView(textView[i]);
frame.addView(customView[i]);
}
}
}
Mon Point De Vue:
public class CustomView extends View {
boolean onTouchHandler = true;
int xVal = 0, yVal = 0;
int index;
double generatedNum = 0;
public CustomView(Context context) {
this(context, 0);
this.index = 0;
}
public CustomView(Context context, int index) {
super(context);
this.index = index;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
switch(action) {
case MotionEvent.ACTION_DOWN: {
//do logic
}
case MotionEvent.ACTION_MOVE: {
//do logic
}
case MotionEvent.ACTION_UP: {
xVal = (int) ev.getX();
yVal = (int) ev.getY();
generateNumber(xVal, yVal, index);
break;
}
}
return onTouchHandler;
}
private void generateNumber(int x, int y, int index) {
if(index == 0) {
generatedNum = (x / 2) * (y / 2) + 64;
} else {
generatedNum = (x / 2) * (y / 2) + (index * 128);
}
}
public double getGeneratedNumber() {
return generatedNum;
}
public boolean setTouchBool(boolean b) {
this.onTouchHandler = b;
}
}
Vous devez vous connecter pour publier un commentaire.
Android sera en cascade vers le bas le point de vue appelant
onTouchEvent
sur chacun d'eux jusqu'à ce qu'il reçoit untrue
de l'un d'eux. Si vous voulez un événement tactile pour être manipulé par tous, alors retourner faux jusqu'à ce qu'il atteigne la dernière.EDIT:
Ok. Si je comprends bien, vous avez une seule vue de dessus contenant un tas de vues enfant une couche profonde. Ma réponse originale à cette question est en supposant que vous avez eu trois vues personnalisées qui ont été sur le dessus les uns des autres dans le ViewGroup de la hiérarchie (Vue3 est un enfant de Vue2. Vue2 est un enfant de Vue1. Vue1 est un enfant de ParentView). Vous voulez le toucher de l'utilisateur de l'événement sur la vue parent pour obtenir envoyé à tous ses enfants.
Si c'est le cas, autant que je sache, il n'y a pas de vue sur Android est une API qui permet que. Donc, vous aurez à faire un affichage personnalisé t-il.
OK, je n'ai pas testé, alors merci de me dire si ça fonctionne et si c'est ce que vous essayez. Créer une classe qui étend la classe quel que soit l'objet
frame
est, puis remplacer leonTouch
méthode comme si.Maintenant, garder la même logique que vos affichages personnalisés, sauf qu'ils devraient tous de retour
false
parce que votre mère ne sera pas recevoir le onTouch événement, sauf comme indiqué dans ma précédente réponseremarque: avec cette application, l'enfant du point de vue que l'utilisateur touche en fait le feu à deux reprises parce que la logique va aller
le feu de l'enfant touch event -> return false -> le feu parent d'événement tactile -> le feu de l'enfant d'événement tactile de nouveau
true
. Si ce n'est pas le cas, alors vous pouvez l'appelersuper.onTouchEvent()
qui renvoie true ou false selon que la vue parent retourné. Comme pour la collecte de valeurs pour chaque vue, qui dépend entièrement de la façon dont votre structure de classe est mis en place.frame
est unLinearLayout
donc je doit le prolonger et remplacer le onTouchEvent. Alors la seule chose que je dois modifier après que monCustomView
's onTouchEvent retourne toujours faux? Si cela est correct, je vais aller de l'avant et de le mettre en œuvre et de faire rapport!false
parce qu'ils sont tous sur le dessus de laLinearLayout
qui signifie que l'utilisateur entrera en contact avec les enfants plutôt que le parent de sorte que vous aurez besoin d'un moyen de mise en cascade de l'événement pour le parent. C'est le seul moyen que j'ai été capable de le faire, mais là encore je n'ai jamais eu besoin de le faire d'une autre manière. Maintenant que j'y pense, cette méthode peut constamment faire une boucle récursive. Vous pourriez être en mesure de corriger cela en appelantonTouch()
sur les enfants directement, plutôt que dedispatchTouchEvent()
, ou il y a un moyen de désactiver les événements tactiles à travers les méthodes de mise au point. Je vais rechercher un peu.