Как повернуть изображение в Android и остановить его случайным образом при нажатии кнопки

Я пытаюсь сделать простое колесо фортуны в моем приложении для Android. Это будет округленное изображение с именами людей. Изображение начнет вращаться (вокруг его центра) при нажатии кнопки под ним. Ротация должна быть остановлена ​​через произвольное время, поэтому ее имя не всегда совпадает с именем человека. сейчас я просто использую изображение с 1-2-3-4, см. ниже.

Пример вывода

Я рассмотрел почти все темы, касающиеся этого, но не могу понять, как сделать это случайным. На данный момент он всегда останавливается под одним и тем же углом, например, всегда под номером 1.

Код у меня есть софар:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_who, container, false);


   final ImageView alberto = (ImageView)view.findViewById(R.id.alberto);
    Button spin =(Button)view.findViewById(R.id.spin);

    final RotateAnimation anim = new RotateAnimation(0f,generateRandomNumber(), Animation.RELATIVE_TO_SELF, 0.5f,
            Animation.RELATIVE_TO_SELF, 0.5f);
    anim.setFillAfter(true);
    anim.setDuration(1000);


    spin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            alberto.startAnimation(anim);
        }
    });

    return view;
}

public float generateRandomNumber() {

    Random rand = new Random();
    int randomNum = rand.nextInt((360 - 0) + 1);

    return (float)randomNum;
}

}

Так что я даю RotateAnimation случайное число, поэтому оно не всегда совпадает с местом, где он прекращает вращаться. Но это не работает, потому что, как я сказал, он всегда останавливается на номер 1, например. я понял, что если я изменю продолжительность анимации, результат будет не таким! Для этого я попытался вставить случайное число в длительность, но это не работает, а. Я проверил другие сообщения, которые говорят, что это случайное, но это не так.

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

Спасибо большое в продвинутом!!!

1 ответ

Решение

Вы можете попробовать следующее:

private static final float BASE_ROTATION_DEGREES = 3600;
private static final int DURATION = 1000;

//...

spin.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        float deg = alberto.getRotation() + BASE_ROTATION_DEGREES + ((float)Math.random() * 360F);
        alberto.animate().rotation(deg).setDuration(DURATION)
            .setInterpolator(new AccelerateDecelerateInterpolator());
    }
});

Вы можете изменить интерполятор на что-то еще, чтобы получить другой эффект.

Изменить: отредактировано, чтобы исправить проблему, при которой только в первом повороте было более одного оборота. Обратите внимание, что это означает, что значение вращения довольно быстро возрастет! Не должен представлять проблему, но стоит иметь в виду.

Другое редактирование: пример приложения / исходного кода здесь, если вы хотите посмотреть. Это нормально работает на моем эмуляторе.

Другие вопросы по тегам