Итак, мой вопрос чем-то похож на эти два вопроса:
Пользовательское представление onDraw постоянно вызывается
android: onDraw вызывается постоянно
У меня есть собственный класс, расширяющий ImageView, к которому я применяю RotateAnimation.В анимации используются входные координаты x и y для поворота от последнего угла к следующему, чтобы пользователь мог поворачивать ImageView по своему желанию, от -360 градусов до 360 градусов.Когда я использую этот код для onDraw (), все выглядит идеально на экране (анимация настроена так, как показано ниже):
@Override
protected void onDraw(Canvas canvas) {
Log.d(TAG, "It is drawn again!");
this.setAnimation(anim);
super.onDraw(canvas);
}
Проблема в том, что так же, как вВ других упомянутых публикациях анимация вызывает onDraw, которая вызывает анимацию и т. д., вероятно, через invalidate () в классе RotateAnimation.Это правильно соблюдается?Выходные данные превосходны, поскольку ImageView всегда остается под текущим вычисленным углом, но при этом продолжаются вычисления анимации, потребляющие много энергии и мощности.
Чтобы исправить это, я попытался переместить this.setAnimation (anim) в методе, где рассчитываются параметры для анимации (пожалуйста, игнорируйте isClockWise (), calcAngleToMove () и другие вещи, не относящиеся к Android, они работают как положено):
private void turnWheel(){
float angle = 0;
if ( isClockWise() ){
angle = calculateAngleToMove();
anim = new RotateAnimation(current_angle, angle, center_x, center_y);
anim.setFillAfter(true);
anim.setFillEnabled(true);
current_angle += angle;
}
else{
angle = - calculateAngleToMove();
anim = new RotateAnimation(current_angle, angle, center_x, center_y);
anim.setFillAfter(true);
anim.setFillEnabled(true);
current_angle += angle;
}
if ( current_angle > 360 ){
current_angle = current_angle - 360;
}
if ( current_angle < -360 ){
current_angle = current_angle + 360;
}
this.setAnimation(anim);
this.invalidate(); //Calls onDraw()
}
Это решает проблему с onDrawпостоянно вызывается, но он создает другое: когда пользователь нажимает, удерживает и поворачивает ImageView, он переключается между нулевым углом и текущим углом.Когда пользователь затем отпускает ImageView, он возвращается к нулевому углу.Желательно всегда поворачивать ImageView в переменную current_angle, даже если пользователь не вводит данные.
Я пробовал разные версии anim.setFillAfter (true), anim.setFillEnabled (true),invalidate () и this.startAnimation (anim), но, похоже, они никогда не влияют на эту проблему.
Где лучше всего вызывать this.setAnimation (anim)?