Следующая и предыдущая анимация

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

И я сделал это так, что похоже, что новое всплывающее окно скользит слева, так как текущий идет справа от экрана, когда пользователь скользит пальцем вправо (движение «Далее»). И наоборот для «предыдущего» движения.

Но проблема в том, что я создал 2 стиля для двух анимаций (слева-в-середине, в то время как средний справа и справа на середину, в то время как средний-левый), и поскольку PopupWindow s не обновляется, пока Он показывает, когда пользователь щелкает вправо («Далее»), а затем влево («Предыдущий»), анимация выглядит изменчивой, поскольку 2 анимации перекрываются. То же самое происходит, когда пятна снова меняются.

Теперь, если я вызываю update() после изменения анимации, он снова переходит в середину. Это еще хуже. Так что я могу сделать, чтобы добиться того, чего я хочу?

Благодарю.

EDIT: Исходный код

Вот код, который я использовал, чтобы показать всплывающее окно в первый раз:

 popup1 = new PopupWindow(popupLayout, popup_width, popup_height, true); popup1.setAnimationStyle(R.style.AnimationPopup); popup1.showAtLocation(this.findViewById(R.id.main_container), Gravity.CENTER, 0, 0); 

И это next() код метода next() :

 if(popup2 != null) popup1 = popup2; if(popup1 != null) { popup2 = new PopupWindow(popupLayout, popup_width, popup_height, true); popup2.setAnimationStyle(R.style.AnimationPopup); popup1.dismiss(); popup2.showAtLocation(rootLayout, Gravity.CENTER, 0, 0); } 

И это код метода prev() :

 if(popup2 != null) popup1 = popup2; if(popup1 != null) { popup2 = new PopupWindow(popupLayout, popup_width, popup_height, true); popup2.setAnimationStyle(R.style.AnimationPopupReverse); popup1.setAnimationStyle(R.style.AnimationPopupReverse); popup1.dismiss(); popup2.showAtLocation(rootLayout, Gravity.CENTER, 0, 0); } 

Это все для кода Java. AnimationPopup – это XML с простым показом слайда справа от центра и скрытой анимацией слайд-от центра к левому. А AnimationPopupReverse – это обратная сторона вышеупомянутых анимаций.

Я впервые попробовал коды. Здесь измененные анимации вступают в силу после отображения еще одного всплывающего окна.

Все анимации выглядят намного чище, если вы используете android:hardwareAccelerated="true" в манифесте под тегом приложения. Даже обычная анимация влево / вправо будет казаться изменчивой, без аппаратного ускорения.

Простое решение:

  1. Отключите прокрутку до окончания текущей анимации.
  2. Используйте android:duration="@android:integer/config_mediumAnimTime" что делает его довольно стандартным и быстрым.

Вы также можете реализовать какое-то перетаскивание:

Catch Touch Events и соответственно измените местоположение Popup. Когда пользователь удаляет свой палец, либо отправляйте салфетки, либо показывайте следующее / предыдущее всплывающее окно. Это на самом деле связано с некоторыми царапинами на голове.


Лучше всего было бы использовать ViewPager, который показывает только всплывающие окна со всеми реализованными функциями:

Пример:

 yourViewPager.setAdapter(new PagerAdapter() { @Override public Object instantiateItem(ViewGroup container, int position) { View view; //intialise view to a PopupWindow or some Layout with a PopupWindow in the location you want container.addView(view, 0); return view; } @Override public boolean isViewFromObject(View view, Object object) { return (view==object); } @Override public int getCount() { //return the count } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } @Override public void finishUpdate(ViewGroup arg0) { } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(ViewGroup arg0) { } });