2009-03-31 7 views

Répondre

6

Oui. Cela dépend de ce que vous essayez d'accomplir.

Il peut être fait en utilisant les API standard, mais cette fonctionnalité n'est pas partie de les APIs standard. Autrement dit, il n'y a pas de méthode widget.DragOverHere() à moins d'en écrire une. Cela dit, cela ne serait pas très compliqué à faire. Au minimum, vous devez écrire une sous-classe personnalisée de View et implémenter deux méthodes: onDraw(Canvas c) et onTouch(MotionEvent e). Une esquisse:

class MyView extends View { 

    int x, y; //the x-y coordinates of the icon (top-left corner) 
    Bitmap bitmap; //the icon you are dragging around 

    onDraw(Canvas c) { 
     canvas.drawBitmap(x, y, bitmap); 
    } 

    onTouch(MotionEvent e) { 
     switch(e.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
     //maybe use a different bitmap to indicate 'selected' 
     break; 
     case MotionEvent.ACTION_MOVE: 
     x = (int)e.getX(); 
     y = (int)e.getY(); 
     break; 
     case MotionEvent.ACTION_UP: 
     //switch back to 'unselected' bitmap 
     break; 
     } 
     invalidate(); //redraw the view 
    } 
} 
0

Dans une certaine mesure. Cela dépend du degré de liberté que vous voulez donner à l'utilisateur. Une solution qui vient à l'esprit est un TableLayout avec des cellules prédéfinies. Un utilisateur peut alors appuyer et faire glisser des composants. Lorsque vous faites glisser un composant, vous voulez simplement en dessiner une image sous le doigt de l'utilisateur, mais lors de leur publication, supprimez le composant de son précédent parent et ajoutez-le au nouveau parent en utilisant les méthodes d'ajout/suppression de ViewGroup.

Bien que vous puissiez déplacer des vues par programme, il serait difficile/impossible de changer de mise en page à la volée aussi loin que je peux voir.

0

La façon dont je l'ai fait est d'avoir une mise en page absolue, puis simplement mettre à jour la position de l'objet comme il est traîné. Vous devez mettre en œuvre en vous traînant. Si les widgets ont un ordre naturel (une barre d'outils où vous pouvez faire glisser les boutons), vous pouvez empiler une mise en page absolue en haut de la barre d'outils et lorsque le glissement commence, vous l'ajoutez à la mise en page absolue et vous l'ajoutez à la disposition d'origine dans la nouvelle position.

Questions connexes