2012-07-12 1 views
1

Donc j'essaye de faire une application de type "poésie magnétique". Les utilisateurs déplacent divers widgets Button sur l'écran. J'utilise un widget Button car il est le plus proche du look de l'aimant, même si je suis ouvert à d'autres options!Glisser-déposer pour Android plus ancien pas précis

Les objets ne bougent pas correctement avec mon doigt. Ils sont proches, mais ils ne correspondent pas exactement à mon doigt. La coordonnée X sur mon téléphone semble aller bien, mais le Y corrdinate est éteint. Est-ce peut-être dû à la barre de titre?

private final static int DRAGGING_OFF = 0; 
private final static int DRAGGING_ON = 1; 

private int dragStatus; 

private GestureDetector mGestureDetector; 
private int mOffsetX; 
private int mOffsetY; 
private LayoutParams mOldParams; 
private RelativeLayout.LayoutParams lp; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if(!mGestureDetector.onTouchEvent(event)) { 
     if(event.getAction() == MotionEvent.ACTION_MOVE) { 
      if(dragStatus == DRAGGING_ON) { 
       Log.e(VIEW_LOG_TAG, "Dragging! RAW -- " + event.getRawX() + " : " + event.getRawY() + " NOT RAW -- " + event.getX() + " : " + event.getY()); 
       int rawX, rawY; 
       int finalX, finalY; 

       rawX = (int) event.getRawX(); 
       rawY = (int) event.getRawY(); 

       finalX = rawX - mOffsetX; 
       finalY = rawY - mOffsetY; 

       lp.setMargins(finalX, finalY, 0, 0); 
       this.setLayoutParams(lp); 
      } 

      return true; 
     } else if(event.getAction() == MotionEvent.ACTION_UP) { 
      if(dragStatus == DRAGGING_ON) { 
       dragStatus = DRAGGING_OFF; 
       Log.e(VIEW_LOG_TAG, "Stopped dragging!"); 
      } 

      return true; 
     } else { 
      return super.onTouchEvent(event); 
     } 
    } else { 
     return true; 
    } 
} 

private final GestureDetector.SimpleOnGestureListener mListener = new GestureDetector.SimpleOnGestureListener() { 
    @Override 
    public boolean onDown(MotionEvent e) {   
     int[] location = new int[2]; 
     Log.e(VIEW_LOG_TAG, "Down! RAW -- " + e.getRawX() + " : " + e.getRawY() + " NOT RAW -- " + e.getX() + " : " + e.getY()); 
     dragStatus = DRAGGING_ON; 

     // Sets the current location of the View in the int[] passed to it; x then y. 
     getLocationInWindow(location); 
     Log.e(VIEW_LOG_TAG, "Down location: " + location[0] + " " + location[1]); 

     mOffsetX = (int) e.getRawX() - location[0]; 
     mOffsetY = (int) e.getRawY() - location[1]; 
     mOldParams = getLayoutParams(); 

     return true; 
    } 
}; 

Répondre

0

Je pense que la question est que vous n'êtes pas obtenir le delta du point de contact courant Y et le point de contact mis en cache, dernier y. Vous avez besoin de quelque chose comme ceci:

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     final TextView textView = (TextView) findViewById(R.id.text); 
     final ImageView image = (ImageView) findViewById(R.id.image); 
     matrix.setTranslate(1f, 1f); 
     image.setImageMatrix(matrix); 
     image.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       matrix.getValues(m); //copy matrix values into array 

       PointF currentXYTouchPoint = new PointF(event.getX(), event.getY()); 

       switch(event.getAction()) { 
        case MotionEvent.ACTION_DOWN: //start of pressed gesture 
         lastXYTouchPoint.set(event.getX(), event.getY()); //save the last touchpoint 
         mode = DRAG; 
         break; 
        case MotionEvent.ACTION_MOVE: 
         //calculate the change in finger position 
         float deltaX = currentXYTouchPoint.x - lastXYTouchPoint.x; 
         float deltaY = currentXYTouchPoint.y - lastXYTouchPoint.y; 
         matrix.postTranslate(deltaX, deltaY); //move the entire image by the deltas 
         image.setImageMatrix(matrix); 

         // save this last starting touchpoint 
         lastXYTouchPoint.set(currentXYTouchPoint.x, currentXYTouchPoint.y); 
         break; 
       } 

       textView.setText("TouchPoint started at " + currentXYTouchPoint.x + ", " + currentXYTouchPoint.y + " & the matrix is now " + Arrays.toString(m)); 
       return true; 
      } 
     }); 

    } 

Adaptez-le à vos propres buts, mais l'idée de base est là.

+0

Cela semble être une méthode réalisable. J'ai juste besoin de le tester avec getLocationInWindow() pour m'assurer que les nombres que je reçois à partir de là peuvent être utilisés directement pour faire des maths et retourner à LayoutParams.setMargins() – tomwardiii

+0

Donc il se trouve que le problème que je rencontrais n'était pas lié à l'utilisation de ma méthode ou en utilisant la méthode delta que vous avez suggérée. Il semble être plus lié à la barre de titre et à la hauteur de la barre d'état. Les nombres que je reçois sont relatifs à l'écran mais les informations sur l'emplacement que je définis sont supposées être relatives à la fenêtre, donc il est désactivé sur la coordonnée Y. Quelqu'un a trouvé ça pour moi: http://andmobidev.blogspot.com/2010/01/getting-height-of-status-and-title-bar.html – tomwardiii

Questions connexes