Я сделал 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"
в манифесте под тегом приложения. Даже обычная анимация влево / вправо будет казаться изменчивой, без аппаратного ускорения.
Простое решение:
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) { } });