Я пытаюсь выполнить простое взаимодействие с графическим интерфейсом - прикоснуться к экрану и заставить красный шар переместиться туда из своей предыдущей позиции.Все отлично работает, за исключением того, что мой мяч появляется в смещении от того, что я хотел.Смещение напрямую связано с тем, где я нарисовал оригинальный мяч.Это как если бы вид шара включал это смещение как часть его размера.Например, если я нарисую оригинал в X = 100, Y = 100 с радиусом 25, позже мне придется вычесть 100 из каждого из возвращаемых значений getX и getY, чтобы разместить его в нужном месте.Я уверен, что это не нормально, но не смог определить мою проблему.Может кто-нибудь помочь?Код
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();
}
}
находится в моем основном приложении.Вслед за
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");
Значения X и Y, которые я получаю от getX и getY, кажутся правильными, но шарик перерисовывается на расстоянии 100 пикселей.
FYI, вот дамп из LogCat:
07-26 20: 54: 43.830: VERBOSE / BookOne (5463): введено onTouch для холста 07-26 20: 54: 43.830: VERBOSE / BookOne (5463): установить координаты 07-26 20:54.размеры шара 1 = 0;г = 800;т = 0;b = 536 07-26 20: 54: 43.830: VERBOSE / BookOne (5463): размеры шара 1 w = 800;h = 536 07-26 20: 54: 43.830: VERBOSE / BookOne (5463): просмотр v размеров l = 0;г = 800;т = 584;b = 1120 07-26 20: 54: 43.830: VERBOSE / BookOne (5463): просмотр v размеров w = 800;h = 536 07-26 20: 54: 43.830: VERBOSE / BookOne (5463): размеры my_canvas l = 0;г = 800;т = 584;b = 1120 07-26 20: 54: 43.830: VERBOSE / BookOne (5463): размеры my_canvas w = 800;h = 536 07-26 20: 54: 43.830: VERBOSE / BookOne (5463): собирается вернуть FALSE
Обратите внимание на размеры на ball1.Каковы последствия?
Большое спасибо заранее за любую помощь.
Майк