2011-07-27 1 views
0

J'essaie de faire une simple interaction GUI - touchez l'écran et faites-y glisser une boule rouge à partir de sa position précédente. Tout fonctionne bien, sauf que ma balle apparaît à un décalage de l'endroit où j'avais l'intention. Le décalage est directement lié à l'endroit où j'ai dessiné la balle d'origine. C'est comme si la vue de la balle incluait ce décalage dans sa taille. Par exemple, si je dessine l'original à X = 100, Y = 100 avec le rayon 25, je dois plus tard soustraire 100 de chacune de mes valeurs getX et getY return pour le placer à l'endroit approprié. Je suis sûr que ce n'est pas normal, mais je n'ai pas pu repérer mon problème. Quelqu'un peut-il aider? Le code estL'opération onDraw ne met pas le cercle où je l'attends

public LinearLayout my_canvas; 
public Ball ball1; 

public class Ball extends View { 
    private final float x; 
    private final float y; 
    private final int r; 
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 

    public Ball(Context context, float x, float y, int r) { 
     super(context); 
     mPaint.setColor(0xFFFF0000); 
     LinearLayout.LayoutParams tlp = 
      new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT); 
     this.setLayoutParams(tlp); 
     this.x = x; 
     this.y = y; 
     this.r = r; 
     Log.v("BookOne", "ball constructor at "+x+","+y); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(x, y, r, mPaint); 
     my_canvas.invalidate(); 
    } 
} 

est dans mon application principale. Suivie par

my_canvas = (LinearLayout) findViewById(R.id.my_canvas); 
    my_canvas.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent e) { 
       Log.v("BookOne", "Entered onTouch for canvas"); 
       float x = e.getX(); 
       float y = e.getY(); 

       Log.v("BookOne", "set coordinates"); 
       ball1.setX(x); 
       ball1.setY(y); 
       ball1.invalidate(); 
       //my_canvas.invalidate(); 

       Log.v("BookOne", "get ranges"); 
       int r = v.getRight(); 
       int l = v.getLeft(); 
       int t = v.getTop(); 
       int b = v.getBottom(); 
       int w = v.getWidth(); 
       int h = v.getHeight(); 
       Log.v("BookOne", "Ball moving to "+x+","+y); 
       log_view_dimensions("ball1 dimensions", ball1); 
       log_view_dimensions("View v dimensions", v); 
       log_view_dimensions("my_canvas dimensions", my_canvas); 
       Log.v("BookOne", "about to return FALSE"); 
       return(false); 
      } 
    }); 

    ball1 = new Ball(my_canvas.getContext(), 100, 100, 25); 
    my_canvas.addView(ball1); 
    Log.v("BookOne", "ball1 added"); 

Les valeurs X et Y que je reçois de getX et getY sont corrects, mais le ballon est redessiner 100 pixels loin.

Pour votre information, voici la décharge de LogCat:

07-26 20: 54: 43,830: -Verbose/BookOne (5463): Entrée OnTouch pour toile 07-26 20: 54: 43,830: -Verbose/BookOne (5463): définir les coordonnées 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): obtenir les plages 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): Balle se déplaçant à 337.0,262.5 07- 26 20: 54: 43.830: VERBOSE/BookOne (5463): billes1 dimensions l = 0; r = 800; t = 0; b = 536 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): dimensions bille1 = 800; h = 536 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): Voir les dimensions v = 0; r = 800; t = 584; b = 1120 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): Voir les dimensions v = 800; h = 536 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): dimensions de my_canvas l = 0; r = 800; t = 584; b = 1120 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): dimensions de my_canvas w = 800; h = 536 07-26 20: 54: 43.830: VERBOSE/BookOne (5463): sur le point de retourner FALSE

Notez les dimensions sur la bille1. Quelles sont les implications?

Un grand merci d'avance pour toute aide.

Mike

Répondre

0

La raison possible pour le décalage de votre cercle est que vous ne l'avez pas la méthode substituée onMeasure(). Si une implémentation de onMeasure n'est pas fournie, par défaut, Android fixera la taille à 100 X 100. C'est la raison pour laquelle vous finissez par soustraire 100 de x et y pour obtenir la balle à l'emplacement correct.

Questions connexes