2012-01-26 3 views
1

J'essaie de faire une application dont l'utilisateur peut déplacer l'image ... Et lorsque l'utilisateur le déplace à un certain endroit, l'application devrait faire quelque chose d'autre ... Kinda déverrouillage ...ACTION_UP ne fonctionne pas

Mais le problème est lorsque l'instruction ACTION_UP ne fonctionne pas ... Des suggestions?

Voici mon code:

public class Main extends Activity { 

    private View selected_item = null; 
    private int offset_x = 0; 
    private int offset_y = 0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ViewGroup vg = (ViewGroup) findViewById(R.id.lout); 
     vg.setOnTouchListener(new View.OnTouchListener() { 

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

          switch (event.getActionMasked()) { 
       case MotionEvent.ACTION_MOVE: 
        int x = (int) event.getX() - offset_x; 
        int y = (int) event.getY() - offset_y; 
        int w = getWindowManager().getDefaultDisplay().getWidth() - 100; 
        int h = getWindowManager().getDefaultDisplay().getHeight() - 100; 
        if (x > w) 
         x = w; 
        if (y > h) 
         y = h; 
        AbsoluteLayout.LayoutParams lp = new AbsoluteLayout.LayoutParams(
          new ViewGroup.MarginLayoutParams(
            AbsoluteLayout.LayoutParams.WRAP_CONTENT, 
            AbsoluteLayout.LayoutParams.WRAP_CONTENT)); 
        lp.x = x; 
        lp.y = y; 
        selected_item.setLayoutParams(lp); 
        break; 
       default: 
        break; 
       } 
       return true; 
      } 
     }); 

     ImageView img = (ImageView) findViewById(R.id.imageView1); 
     img.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getActionMasked()) { 
       case MotionEvent.ACTION_DOWN: 
        offset_x = (int) event.getX(); 
        offset_y = (int) event.getY(); 
        selected_item = v; 
        break; 
       case MotionEvent.ACTION_UP: 
        if (offset_x < 150 && offset_x > 120 && offset_y < 230 
          && offset_y > 200) 
         startActivity(new Intent(
           "com.yahya.GeneralTraining.UNLOCKED")); 
        break; 
       default: 
        break; 
       } 
       return false; 

      } 
     }); 

    } 
} 
+0

Lorsque vous relâchez votre doigt, est-il toujours sur ImageView? –

+0

Comment puis-je le savoir? – yahya

Répondre

1

On dirait que votre implémentation est pas exactement ce que vous recherchez, vous devez assigner offset_x et offset_y valeurs à l'intérieur ACTION_UP au lieu de ACTION_DOWN. À l'heure actuelle, cela fonctionnera comme si l'utilisateur commençait à glisser de x (120 à 150) et y (200 à 230) et à tomber n'importe où. L'intention de déverrouillage se déclenchera, mais ce que vous voulez, c'est glisser de n'importe où et passer à x (120 à 150) et y (200 à 230).

Donc, écrire:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    //Are you sure you want event.getActionMasked() ?? 
    //I use event.getAction() 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     //I don't believe you really need anything to do here 
     break; 
     case MotionEvent.ACTION_UP: 
      offset_x = (int) event.getX(); 
      offset_y = (int) event.getY(); 
      selected_item = v; 
      if (offset_x < 150 && offset_x > 120 && offset_y < 230 && offset_y > 200) 
       startActivity(new Intent("com.yahya.GeneralTraining.UNLOCKED")); 
     break; 
     default: 
     break; 
    } 
    return false; 
} 
}); 
+0

Comme ça, ce n'est même pas bouger:/Donc je suppose que ça devrait être dans ACTION_DOWN ... mais j'essaie aussi de les mettre dans ACTION_UP .. ne fonctionne toujours pas:/ – yahya

+1

Êtes-vous sûr de vouloir event.getActionMasked() ?? i utilise l'utilisation event.getAction() ....... vérifier le code édité –

+0

Je viens d'essayer votre chemin, mais il donne l'erreur "NullPointerException" sur cette ligne: \t \t \t \t \t selected_item.setLayoutParams (lp); – yahya

7

Je pense que vous avez besoin de revenir true dans votre rappel imageView OnTouch(). Pour une raison quelconque, renvoyer false après ACTION_DOWN vous empêche de recevoir un autre appel avec ACTION_UP.

+0

Quand je le fais "vrai", l'image ne bouge même pas ... – yahya

2

votre fonction OnTouch doit retourner vrai. Cela évite que d'autres écouteurs prennent le contrôle de l'événement et gâchent votre application.