2010-11-28 6 views
1

J'ai écrit la fonction suivante afin de faire glisser un ImageView sur l'écran. Semble fonctionner correctement, sauf en faisant glisser l'image saute comme un fou.Valeurs de saut étranges pour onTouchListener utilisant un RelativeLayout dans Android

En regardant le journal le problème semble être que j'obtiens des valeurs incorrectes pour X et Y entre chaque valeur correcte. Je ne suis pas sûr de savoir pourquoi. Quelqu'un peut-il m'aider à résoudre ce problème?

hereOnTouchListener imageListener = new OnTouchListener(){ 

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    // TODO Auto-generated method stub 
    int eventAction = event.getAction(); 

    int X = (int)event.getX(); 
    int Y = (int)event.getY(); 
    if (eventAction == MotionEvent.ACTION_DOWN){ 
    dragging = true; 
    tempParams = new RelativeLayout.LayoutParams(v.getWidth(), v.getHeight()); 
Log.i("v width and height", v.getWidth() + " " + v.getHeight()); 
    }  
    if (eventAction == MotionEvent.ACTION_UP){ 
    Log.i("dragging up","dragging up" + X + " " + Y); 
    dragging = false; 
    } else if (eventAction == MotionEvent.ACTION_MOVE){ 
    if (dragging){ 
    Log.i("dragging","dragging " + X + " " + Y); 
    tempParams.leftMargin = X; 
    tempParams.topMargin = Y; 
    v.setLayoutParams(tempParams); 
    // v.setPadding(X, Y, 0, 0); 
    v.invalidate(); 
    } 
    } 


    return true; 
} 

}; 
échantillon

de sortie du journal:

11-27 19:43:34.484: INFO/dragging(3530): dragging 131 131 
11-27 19:43:34.504: INFO/dragging(3530): dragging 84 288 
11-27 19:43:34.519: INFO/dragging(3530): dragging 132 134 
11-27 19:43:34.539: INFO/dragging(3530): dragging 84 292 
11-27 19:43:34.554: INFO/dragging(3530): dragging 132 139 
11-27 19:43:34.574: INFO/dragging(3530): dragging 84 294 
11-27 19:43:34.594: INFO/dragging(3530): dragging 132 142 
11-27 19:43:34.609: INFO/dragging(3530): dragging 84 294 
+0

Pourriez-pls. reformatez votre question pour la rendre plus lisible. –

Répondre

0

Enfin figured it out. Le problème était que j'utilisais event.getX() donc je pensais que lorsque je traînais mon doigt, il calculait une valeur basée sur l'ImageView ainsi que celle basée sur la surface sous-jacente.

+3

Et comment avez-vous résolu ce problème? – I82Much

0

En fait, cela se produit parce que vous modifiez les marges de la même vue dont le paramètre onTouchListener est défini. Pour éviter cela, vous devez utiliser des vues séparées: une vue doit récupérer getX() ou getY() depuis son onTouchListener et utiliser cette information pour modifier les marges de l'autre vue.

<FrameLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <RelativeLayout 
     android:id="@+id/content" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 
    </RelativeLayout> 

    <RelativeLayout 
     android:id="@+id/touch_listener" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</FrameLayout> 
+0

Essayé cela, cela ne semble pas aider. J'ai un RelativeLayout avec un ImageView à l'intérieur et j'ai le onTouchListener sur l'ImageView. C'est toujours très nerveux. –

+0

@dpk - Cela se produit parce que votre ImageView se trouve dans le RelativeLayout qui intercepte le contact. Celui qui écoute le toucher doit être sur le même niveau d'imbrication que votre RelativeLayout. J'ai mis à jour ma réponse avec un exemple de code. –

+0

J'ai fini par faire quelque chose de différent - j'ai déplacé le OnTouchListener vers l'emballage RelativeLayout et l'ai fait déplacer son enfant ImageView. Je ne suis pas sûr que ce soit idéal mais ça a fait l'affaire. –

0

@ I82Much J'ai eu ce même problème il y a quelque temps que je aussi utilisait la méthode getX() mais plutôt changé pour getRawX() et il fonctionne très bien. Espérons que cela aide

Questions connexes