Voici mon code, je veux détecter quand mon doigt descend l'écran donc quand je touche l'écran je détecte le ACTION_DOWN
mais quand je descends l'écran avec mon doigt, ACTION_MOVE
n'est pas reconnu, ni ACTION_UP
Est-ce que tu sais pourquoi?
float x=0;
protected void onCreate(Bundle savedInstanceState) {
do things
ImageView image2 = (ImageView) findViewById(R.id.imageView3);
image2.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction()==MotionEvent.ACTION_DOWN) {
x=arg1.getX();
}
else {
if (arg1.getAction()==MotionEvent.ACTION_MOVE){
if (arg1.getX()>x) {
do things
}
}
else {
if (arg1.getAction()==MotionEvent.ACTION_UP){
do things
}
}
}
}
Si votre méthode onTouch()
renvoie false
en réponse au ACTION_DOWN
MotionEvent
initial, elle ne recevra aucun des événements ultérieurs qui appartiennent à ce geste particulier . Au lieu de cela, ces événements tactiles seront présentés au parent dans la hiérarchie.
Pour exprimer cela d'une autre manière, si vous retournez false
à partir de onTouch()
au début d'un geste (le ACTION_DOWN
), Cela signale que la méthode ne veut plus voir aucun plus du geste, et que les événements du geste doivent aller au parent View
.
Comme le souligne markproxy dans les commentaires ci-dessous, retourner false
lorsque le MotionEvent
est autre chose qu'un ACTION_DOWN
, Tel qu'un ACTION_MOVE
Par exemple, va - not empêche les MotionEvent
s suivants dans le geste courant d'être présentés au View
.
MotionEvent.getAction()
renvoie plus que juste le drapeau. Essayez ce qui suit:
int action = arg1.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_MOVE) ...
Vous pouvez également utiliser MotionEvent.getActionMasked()
. Voir aussi http://developer.Android.com/reference/Android/view/MotionEvent.html
Quelques choses:
1) Vous devez renvoyer un booléen pour montrer que vous avez consommé l'événement.
Voici une implémentation très simple qui fonctionne:
package com.test;
import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.View.OnTouchListener;
public class TestProjActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String TAG = "TEST_TAG";
View v = findViewById(R.id.touchTest);
v.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN) {
Log.e(TAG,"Down");
return true;
}
if (event.getAction()==MotionEvent.ACTION_MOVE){
Log.e(TAG,"Move");
return true;
}
if (event.getAction()==MotionEvent.ACTION_UP){
Log.e(TAG,"Up");
return true;
}
return false;
}
});
}
}
Voici le fichier main.xml
::
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<TextView
Android:id="@+id/touchTest"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="@string/hello" />
</LinearLayout>
Il y a deux cas:
1) Si vous définissez également OnClickListener () -> onTouch () devrait retourner false.
(Si onTouch () renvoie true, OnClickListener () ne fonctionnera pas)
2) Si vous ne définissez pas OnClickListener () -> onTouch () devrait retourner true.
(Si onTouch () renvoie false, seul ACTION_DOWN est appelé)
Vérifiez la valeur de retour de la méthode onTouch ().
cela devrait être vrai, pas faux.
return true;
j'espère que cela fonctionnera.