Наконец-то есть способ обойти это, правильный способ сделать это - 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
, чтобы установить параметры макета в соответствии с вашими требованиями