Как я могу использовать RotateAnimation для вращения круга?

Я хочу, чтобы мое изображение круга (ImageView) вращалось, когда пользователь касался и перетаскивал его. Если пользователь перетаскивает его вправо, он должен вращаться вправо и наоборот. Например, когда вы крутите диджейский диск, если вы понимаете, о чем я. Я немного поиграл с OnTouchListener и RotateAnimation, но ничего не получается.

Любые идеи?


person shuwo    schedule 15.06.2010    source источник
comment
Возможно, вы могли бы показать свою попытку с подробностями о том, что не работает.   -  person Cheryl Simon    schedule 16.06.2010
comment
На самом деле я даже не знаю, как поступить с тем, что я хочу. Мне просто нужны некоторые идеи, как это может быть достигнуто.   -  person shuwo    schedule 16.06.2010


Ответы (1)


Предположим, у вас есть ImageView mCircle, который вы хотите повернуть. Вы должны использовать RotateAnimation, чтобы повернуть его. В методе OnTouch определите угол, под которым находится палец пользователя.

Например, в своей основной деятельности выполните следующие действия.

private ImageView mCircle;
private double mCurrAngle = 0;
private double mPrevAngle = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mCircle = (ImageView) findViewById(R.id.circle);
    mCircle.setOnTouchListener(this); // Your activity should implement OnTouchListener
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    final float xc = mCircle.getWidth() / 2;
    final float yc = mCircle.getHeight() / 2;

    final float x = event.getX();
    final float y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {
        mCircle.clearAnimation();
        mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
        break;
    }
    case MotionEvent.ACTION_MOVE: {
        mPrevAngle = mCurrAngle;
        mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
        animate(mPrevAngle, mCurrAngle, 0);
        break;
    }
    case MotionEvent.ACTION_UP : {
        mPrevAngle = mCurrAngle = 0;
        break;
    }
    }

    return true;
}

private void animate(double fromDegrees, double toDegrees, long durationMillis) {
    final RotateAnimation rotate = new RotateAnimation((float) fromDegrees, (float) toDegrees,
            RotateAnimation.RELATIVE_TO_SELF, 0.5f,
            RotateAnimation.RELATIVE_TO_SELF, 0.5f);
    rotate.setDuration(durationMillis);
    rotate.setFillEnabled(true);
    rotate.setFillAfter(true);
    mCircle.startAnimation(rotate);
}
person vasart    schedule 12.01.2013
comment
Великолепно! Простой и элегантный. Спасибо @vasart! - person Bitcoin Cash - ADA enthusiast; 30.01.2014
comment
Я изменил ваш код, чтобы он работал как ручка, которая будет находиться в диапазоне от -120 до 120 градусов. Но всякий раз, когда я ActionDown, он возвращается в исходное положение, я хочу сохранить последний угол касания, и всякий раз, когда я ActionDown, он будет в последней позиции. - person AndroidGeek; 20.01.2015
comment
@Nepster, попробуйте прокомментировать вызов clearAnimation(). - person vasart; 20.01.2015
comment
@vasart, комментирование clearAnimation() не помогает. - person Mohammad Tauqir; 27.12.2016