Android - перемещение объекта по кругу - PullRequest
1 голос
/ 10 октября 2011

У меня проблемы с чем-то, Мне нужно сделать объект (весло понг), чтобы двигаться только по кругу вдоль экрана. То же самое, как если бы вы имели постоянное значение оси Y, и оно двигалось бы только вдоль оси X, когда вы перетаскиваете на него палец, но ограничивало его круговым маршрутом.

какие-либо идеи? Я видел эту вещь http://www.kirupa.com/developer/mx/circular.htm

и это только помогает понять, как постоянно перемещать что-либо по кругу (хотя это Flash, идея та же самая)

Спасибо

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

Точки на окружности могут быть определены функциями:

x = a + r cos(θ)
y = b + r sin(θ)

Где (a, b) - центр круга.

В зависимости от желаемой скорости, вы можете сказать, что хотите, чтобы полный круг происходил каждые T секунд. И если t - это время с момента начала анимации:

θ = (360 / T) * (t % T)

Вы можете использовать эти функции для создания собственной ViewAnimation, функции OpenGL или, если вы используете canvas, для установки положения весла во время события onDraw().

2 голосов
/ 10 октября 2011

Вот блок кода, который я использую, чтобы повернуть просмотр изображения одним пальцем.

private float mCenterX, mCenterY;
private float direction = 0;
private float sX, sY;
private float startDirection=0;
private void touchStart(float x, float y) {
    mCenterX = this.getWidth() / 2;
    mCenterY = this.getHeight() / 2;
    sX = x;
    sY = y;
}

private void touchMove(float x, float y) {
    // this calculate the angle the image rotate
    float angle = (float) angleBetween2Lines(mCenterX, mCenterY, sX, sY, x,
            y);
    direction = (float) Math.toDegrees(angle) * -1 + startDirection;
    this.invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.rotate(direction, mCenterX, mCenterY);
    super.onDraw(canvas);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    float x = event.getX();
    float y = event.getY();
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
         // record the start position of finger
        touchStart(x, y);
        break;
    case MotionEvent.ACTION_MOVE:
         // update image angle
        touchMove(x, y);
        break;
    case MotionEvent.ACTION_UP:
        startDirection = direction;
        break;
    }

    return true;
}

public double angleBetween2Lines(float centerX, float centerY, float x1,
        float y1, float x2, float y2) {
    double angle1 = Math.atan2(y1 - centerY, x1 - centerX);
    double angle2 = Math.atan2(y2 - centerY, x2 - centerX);
    return angle1 - angle2;
}

Надеюсь, эта помощь

Редактировать: в основном, то, что делает приведенный выше код, позволяет пользователюповерните изображение, и центр изображения не изменится.angleBetween2Line () - для вычисления степени перемещения пальца по кругу, центр которого является центром изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...