TranslateAnimation в ImageView (Android)

Итак, у меня есть ImageView в моем макете, и я хотел сдвинуть его вправо или влево, когда пользователь проводит пальцем по последнему. Я использовал TranslateAnimation для перевода ImageView, как показано ниже.

ImageView logoFocus = (ImageView) findViewById(R.id.logoFocus);

Animation animSurprise2Movement = new TranslateAnimation(logoFocus.getLeft(), logoFocus.getLeft()+150, logoFocus.getTop(), logoFocus.getTop());
animSurprise2Movement.setDuration(1000);
animSurprise2Movement.setFillAfter(true);
animSurprise2Movement.setFillEnabled(true);
logoFocus.startAnimation(animSurprise2Movement);

Я поместил этот код в раздел «Проведите пальцем вправо» и тот же код, но с использованием getLeft()-150 для раздела «Проведите пальцем влево». Это работает, как и ожидалось, когда я прокручиваю в первый раз, но когда я прокручиваю в другом направлении, ImageView возвращается в исходное положение, а затем скользит в другом направлении, а не только скользит в исходное положение.

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

MarginLayoutParams params = (MarginLayoutParams) logoFocus.getLayoutParams();
params.setMargins(logoFocus.getLeft()+150, logoFocus.getTop(), logoFocus.getRight(), logoFocus.getBottom());
logoFocus.setLayoutParams(params);

Я также пробовал следующее в том же методе, но это не сработало, как ожидалось.

((RelativeLayout.LayoutParams) logoFocus.getLayoutParams()).leftMargin += 150;
logoFocus.requestLayout();

Кто-нибудь, пожалуйста, помогите мне? Похоже, что позиция не меняется после анимации, даже при использовании setFillAfter(true) и setFillEnabled(true). Есть ли альтернатива использованию TranslateAnimation?

Спасибо за любую помощь, которую я могу получить. :)


person jpmastermind    schedule 19.10.2012    source источник
comment
Да, вы столкнулись с ограничением дизайна с TranslateAnimation API. Анимация изменяется в том месте, где ImageView отображается на экране, но фактически не меняет расположение ImageView в макете. В качестве альтернативы можно использовать новый объектно-ориентированный API анимации, представленный в Android 3.0 (android-developers.blogspot.com/2011/02/)   -  person mportuesisf    schedule 20.10.2012
comment
Спасибо за ответ. Но что, если я разрабатываю для Android 2.3 (уровень API 9), это не сработает? Неужели нет другого пути..? :/   -  person jpmastermind    schedule 20.10.2012
comment
Я думаю, вы можете вручную переместить предмет, просто вы не нашли правильный волшебный рецепт для этого. Попробуйте установить новый LayoutParams в ImageView, а не обновлять текущий. К сожалению, извините, я пропустил код, где вы это пробовали. Будьте уверены, что ImageView можно переместить в макете программно — возможно, другой человек заметит сбой в вашем коде.   -  person mportuesisf    schedule 20.10.2012


Ответы (1)


Хорошо, поэтому я обошла это. Теперь я использую глобальную переменную, которую обновляю каждый раз, когда анимирую ImageView, вместо того, чтобы пытаться заставить ImageView изменить свое фактическое положение. Поскольку я использую setFillAfter(true) и setFillEnabled(true), он больше не возвращается непреднамеренно в исходное положение.

private float xCurrentPos, yCurrentPos;
private ImageView logoFocus;

logoFocus = (ImageView) findViewById(R.id.logoFocus); 
xCurrentPos = logoFocus.getLeft(); 
yCurrentPos = logoFocus.getTop(); 

Animation anim= new TranslateAnimation(xCurrentPos, xCurrentPos+150, yCurrentPos, yCurrentPos); 
anim.setDuration(1000); 
anim.setFillAfter(true); 
anim.setFillEnabled(true); 
animSurprise2Movement.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationStart(Animation arg0) {}

    @Override
    public void onAnimationRepeat(Animation arg0) {}

    @Override
    public void onAnimationEnd(Animation arg0) {
        xCurrentPos -= 150;
    }
});
logoFocus.startAnimation(anim);

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

person jpmastermind    schedule 21.10.2012