下一步&以前的动画

时间:2013-03-16 07:28:06

标签: android animation popupwindow gestures

当用户选择列表中的项目时,我弹出了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与上述动画相反。

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

2 个答案:

答案 0 :(得分:2)

如果您在应用标记下的清单中使用android:hardwareAccelerated="true",则所有动画都会显得更清晰。即使是常规的幻灯片左/右动画也不会出现硬件加速。

答案 1 :(得分:1)

一个简单的解决方案是:

  1. 禁用滑动,直到当前动画结束。
  2. 使用android:duration="@android:integer/config_mediumAnimTime"使其非常标准,速度更快。

  3. 您还可以实施某种拖动:

    抓住触摸事件并相应地更改弹出窗口的位置。当用户移开他的手指时,或者发送滑动并显示下一个/上一个弹出窗口。这实际上会涉及一些头痛。


    最好的方法是使用一个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) {
        }
    });