Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Android - перемещение объекта по кругу

Автор вопроса: La bla blaОтветов: 2

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

любые идеи? Я видел эту штуку http://www.kirupa.com/developer/mx/circular.htm

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

Спасибо

androidjavaeclipsegeometry

Ответы

Ответ 1 · рейтинг 2 · Wenhui

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

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() вычисляет степень, в которой палец переместился по кругу, центр которого является центром изображения.

Ответ 2 · рейтинг 3 · spatulamania

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

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

Где (a,b) - центр окружности.

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы