当用户选择列表中的项目时,我弹出了PopupWindow
。然后当他在弹出窗口中左右滑动时,数据(在弹出窗口中)分别变为列表中的上一个和下一个项目。
我已经做到这一点,当用户向右滑动手指(“下一步”动作)时,当前一个窗口从屏幕右侧熄灭时,它看起来像是从左侧滑入的新弹出窗口。反之亦然“上一步”动议。
但问题是,因为我为两个动画制作了两种风格(左到中间,中间到右边,右到中间,中间到左边),以及{{1}当s显示时,当用户向右滑动(“Next”)然后向左滑动(“Previous”)时,动画看起来不稳定,因为2个动画重叠。当滑动再次反转时也会发生同样的情况。
现在,如果我在更改动画后调用PopupWindow
,那么它会再次滑入中间。那更糟糕的是。那么我能做些什么来实现我想要的行为呢?
感谢。
编辑:源代码
这是我用来第一次显示弹出窗口的代码:
update()
这是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()
这是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()
这就是Java代码的全部内容。 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);
}
是一个XML,带有一个简单的 show ,从右到中滑动,隐藏从中心滑到左边动画。 AnimationPopup
与上述动画相反。
我已经提供了我的第一次尝试代码。在这里,更改的动画在再显示一个弹出窗口后生效。
答案 0 :(得分:2)
如果您在应用标记下的清单中使用android:hardwareAccelerated="true"
,则所有动画都会显得更清晰。即使是常规的幻灯片左/右动画也不会出现硬件加速。
答案 1 :(得分:1)
一个简单的解决方案是:
android:duration="@android:integer/config_mediumAnimTime"
使其非常标准,速度更快。您还可以实施某种拖动:
抓住触摸事件并相应地更改弹出窗口的位置。当用户移开他的手指时,或者发送滑动并显示下一个/上一个弹出窗口。这实际上会涉及一些头痛。
最好的方法是使用一个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) {
}
});