Как повернуть изображение в 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());
}
});
Вы можете изменить интерполятор на что-то еще, чтобы получить другой эффект.
Изменить: отредактировано, чтобы исправить проблему, при которой только в первом повороте было более одного оборота. Обратите внимание, что это означает, что значение вращения довольно быстро возрастет! Не должен представлять проблему, но стоит иметь в виду.
Другое редактирование: пример приложения / исходного кода здесь, если вы хотите посмотреть. Это нормально работает на моем эмуляторе.