Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 下一步&;以前的动画_Android_Animation_Popupwindow_Gestures - Fatal编程技术网

Android 下一步&;以前的动画

Android 下一步&;以前的动画,android,animation,popupwindow,gestures,Android,Animation,Popupwindow,Gestures,我制作了一个PopupWindow,当用户选择列表中的项目时,它会弹出。然后,当他在弹出窗口上向左和向右滑动时,数据(在弹出窗口中)将分别更改为列表中的上一项和下一项 我这样做的目的是,当用户将手指向右滑动(“下一个”动作)时,当当前弹出窗口从屏幕右侧消失时,一个新的弹出窗口从左侧滑入。“先前”动议的情况也一样 但问题是,由于我为这两个动画制作了两种样式(从左到中,从中到右,从右到中,从中到左),而且当用户向右(“下一步”)然后向左(“上一步”)滑动时,PopupWindows在显示时不会得到更

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

我这样做的目的是,当用户将手指向右滑动(“下一个”动作)时,当当前弹出窗口从屏幕右侧消失时,一个新的弹出窗口从左侧滑入。“先前”动议的情况也一样

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

现在,如果我在更改动画后调用
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);
}
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);
}
这是
prev()
方法的代码:

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);
}
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,它简单地从右到中显示幻灯片,并隐藏从中到左的幻灯片动画。而
animationpopurpreverse
与上述动画相反


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

一个简单的解决方案是:

  • 禁用滑动直到当前动画结束
  • 使用
    android:duration=“@android:integer/config\u 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) {
        }
    });
    

    如果在应用程序标记下的清单中使用android:hardwareAccelerated=“true”,所有动画看起来都会更干净。即使是常规的左/右滑动动画,在没有硬件加速的情况下也会出现起伏。

    如果您只需要滑动动画,则可以在弹出窗口中充气查看寻呼机。@shreshas正如我在问题中所述,我已使幻灯片工作,但动画应根据滑动(手势)方向动态反转。否则,它可以正常工作。那么您遇到的问题只是性能问题?你是如何让动画和弹出窗口一起工作的?我认为你应该发布一些代码来提供更多的细节。你记得在清单中使用android:hardwareAccelerated=“true”?@Warpzit不,这会有所不同吗?我很快会发布一些代码。回答得很好!你的第一个解决方案有点奏效。不完全是我想的,但现在我有了一个有趣的效果。非常感谢……)很好的解决方案…+1虽然对我来说感觉像:“你可以使用三星S3,它将不再是波涛汹涌的”@SherifelKhatib ye我的S3没有它就无法制作出正确的动画。