Операция onDraw не помещает круг, где я ожидаю - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь выполнить простое взаимодействие с графическим интерфейсом - прикоснуться к экрану и заставить красный шар переместиться туда из своей предыдущей позиции.Все отлично работает, за исключением того, что мой мяч появляется в смещении от того, что я хотел.Смещение напрямую связано с тем, где я нарисовал оригинальный мяч.Это как если бы вид шара включал это смещение как часть его размера.Например, если я нарисую оригинал в 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.Каковы последствия?

Большое спасибо заранее за любую помощь.

Майк

1 Ответ

0 голосов
/ 20 марта 2012

Возможная причина смещения вашего круга в том, что вы не переопределили метод onMeasure ().Если реализация onMeasure не предусмотрена, то по умолчанию Android установит размер 100 X 100. По этой причине в итоге вы вычитаете 100 из x и y, чтобы получить мяч в правильном месте.

...