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