Question

J'essaie de faire une application sur laquelle l'utilisateur peut déplacer l'image ... et lorsque l'utilisateur le déplace vers un certain endroit, l'application doit faire autre chose ... un peu déverrouiller ...

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

Voici mes codes:

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;

            }
        });

    }
}
Était-ce utile?

La solution

On dirait que votre implémentation n'est pas exactement ce que vous recherchez, vous devriez attribuer offset_x et offset_y valeurs à l'intérieur ACTION_UP à la place 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ù. Déverrouiller l'intention tirera, mais ce que vous voulez, c'est faire glisser de n'importe où et tomber à X (120 à 150) et Y (200 à 230).

Alors écrivez:

@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;
}
});

Autres conseils

Je pense que tu dois revenir true Dans votre rappel ImageView Ontouch (). Pour une raison quelconque retournant faux après ACTION_DOWN vous fait ne pas recevoir un autre appel avec ACTION_UP.

Votre fonction Ontouch doit retourner vrai. Cela évite à un autre auditeur de prendre le contrôle de l'événement et de gâcher votre application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top