4

当用户选择列表中的项目时,我制作了一个PopupWindow弹出窗口。然后当他在弹出窗口上左右滑动时,数据(在弹出窗口中)分别更改为列表中的上一个和下一个项目。

而且我已经做到了,当用户向右滑动手指(“下一个”动作)时,当当前弹出窗口从屏幕右侧退出时,它看起来就像一个新的弹出窗口从左侧滑入。对于“上一个”动议,反之亦然。

但问题是,因为我为这两个动画制作了 2 种样式(从左到中,而从中到右,从右到中,而从中到左),并且PopupWindows 在它的同时没有得到更新正在显示,当用户向右滑动(“下一个”)然后向左滑动(“上一个”)时,由于 2 个动画重叠,动画看起来不连贯。当再次反转滑动时也会发生同样的情况。

现在,如果我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()方法的代码:

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上面的动画相反。

我已经提供了我的代码的第一次尝试。在这里,更改的动画在显示更多弹出窗口生效。

4

2 回答 2

2

android:hardwareAccelerated="true"如果您在应用程序标签下的清单中使用,所有动画看起来都更清晰。如果没有硬件加速,即使是常规的左右滑动动画也会显得断断续续。

于 2013-03-26T10:40:45.803 回答
1

一个简单的解决方案是:

  1. 禁用滑动直到当前动画结束。
  2. 使用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) {
    }
});
于 2013-03-26T10:22:57.897 回答