Android: обновление позиции LinearLayout после завершения анимации - PullRequest
3 голосов
/ 28 апреля 2011

Любая помощь со следующей проблемой будет принята с благодарностью.Я знаю, что мне нужно сделать, и я проверил документы разработчика, но точный синтаксис, который мне нужно использовать, ускользает от меня (я нуб).

Вот что я делаю.У меня есть файл translate.xml в res / anim, который отлично работает.Это выглядит так:

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
   android:fromXDelta="0%" 
   android:toXDelta="0%" 
   android:fromYDelta="0%" 
   android:toYDelta="10%" 
   android:repeatCount="0" 
   android:duration="1000" 
   android:fillEnabled="true" 
   android:fillAfter="true"/>

Я выполняю свой код следующим образом:

    l = (LinearLayout) findViewById(R.id.linearLayout1);
    a = AnimationUtils.loadAnimation(this, R.anim.translate);
    a.setAnimationListener(new AnimationListener() {
        public void onAnimationStart(Animation anim){};
        public void onAnimationRepeat(Animation anim){};
        public void onAnimationEnd(Animation anim){
            //l.setLayoutParams(params);
        };
    });
l.startAnimation(a);

Когда анимация закончится, я бы хотел, чтобы LinearLayout был анимирован, чтобы перейти на новую позицию(куда анимация переместила его).Причина этого в том, что LinearLayout содержит несколько элементов формы, с которыми пользователь может взаимодействовать.

Это действительно простая анимация для довольно простого проекта.Он просто перемещает элемент примерно на 30 пикселей вниз по экрану.Я бы не стал просить о помощи, за исключением того, что боролся с этим уже несколько часов.Я знаю, что мне нужно обновить параметры LinearLayout в конце анимации, но как именно?Я читал несколько разных способов, и все они немного сбивают с толку.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2013

Наконец-то есть способ обойти это, правильный способ сделать это - setFillAfter(true),

, если вы хотите определить свою анимацию в xml, вам следует сделать что-то вродеэто

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/decelerate_interpolator"
     android:fillAfter="true">

    <translate 
        android:fromXDelta="0%"
        android:toXDelta="-100%"
        android:duration="1000"/>

</set>

вы можете видеть, что я определил filterAfter="true" в теге set, если вы попытаетесь определить его в теге translate, он не будет работать,может быть ошибка в структуре !!

, а затем в коде

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out);
someView.startAnimation(anim);

ИЛИ

TranslateAnimation animation = new TranslateAnimation(-90, 150, 0, 0);

            animation.setFillAfter(true);

            animation.setDuration(1800);

            someView.startAnimation(animation);

тогда это, безусловно, будет работать !!

Теперь это немного сложно, кажется, что представление фактически перемещается в новую позицию, но фактически пиксели представления перемещаются, т.е. ваш вид фактически находится в своем начальном положении.положение, но не видимое, вы можете проверить его, если у вас есть какая-то кнопка или кликабельный вид (в моем случае в макете), чтобы исправить то, что вам придется вручную переместить ваш вид / макет в новое положение

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

new TranslateAnimation(-90, 150, 0, 0);

Теперь, когда мы видим, что наша анимация будет начинаться с -90 по оси X до 150 по оси X

, то, что мы делаем, установлено

someView.setAnimationListener(this);

и в

public void onAnimationEnd(Animation animation)
{
   someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight());
}

теперь позвольте мне объяснить, public void layout (int left, int top, int right, int botton)

он перемещает ваш макет в новую позицию, первый аргумент определяет левый, который у нас равен 150 , потому что анимация перевода оживила наш вид на 150 по оси x , top равен 0 , потому что у нас нет анимированной оси y, теперь справа мы сделали someView.getWidth() + 150в основном мы получаем ширину нашего вида и добавляем 150 , потому что теперь мы слева направо перемещаемся к 150 по оси x , чтобы сделать ширину вида исходной, а дно равновысота нашего взгляда.

Я надеюсь, что вы, люди, теперь поняли концепцию перевода, и, тем не менее, у вас есть какие-либо вопросы, которые вы можете задать сразу в разделе комментариев, я рад помочь:)

РЕДАКТИРОВАТЬ Не используйте метод layout(), так как он может вызываться платформой, когда просмотр недействителен и ваши изменения не будут сохраняться, используйте LayoutParams, чтобы установить параметры макета в соответствии с вашими требованиями

0 голосов
/ 28 апреля 2011

Вместо создания нового AnimationListener, попробуйте реализовать интерфейс AnimationListener для вашего текущего (или нового) класса. Затем просто переопределите метод onAnimationEnd().

Пример:

public class ThisClass implements AnimationListener {

      private otherMethod() {
          l.getAnimation().setAnimationListener(this);
      }

      public void onAnimationStart(Animation anim){};
      public void onAnimationRepeat(Animation anim){};
      public void onAnimationEnd(Animation anim){
          l.setLayoutParams(params);
      };

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...