52

我的应用程序中有一个弹出窗口,当单击某个按钮时它会出现不工作?这是我的代码:

我的动画.xml...

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0.0"
        android:toAlpha="1.0" 
        android:interpolator="@android:anim/accelerate_interpolator" 
        android:duration="4000"
        android:repeatCount="1"/>
</set>

================================================

创建弹出窗口

private PopupWindow showOptions(Context mcon){
    try{ 
        LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.options_layout,null);
        layout.setAnimation(AnimationUtils.loadAnimation(this, R.anim.myanim));
        PopupWindow optionspu = new PopupWindow(layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        optionspu.setFocusable(true);
        optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
        optionspu.update(0, 0, LayoutParams.WRAP_CONTENT, (int)(hei/5));
        optionspu.setAnimationStyle(R.anim.myanim);
        return optionspu;
    }
    catch (Exception e){e.printStackTrace();
    return null;}
}

================================================== onClick方法...(optionsPopup 是 PopupWindow 类型的全局变量)

 @Override
public void onClick(View v) {
               switch (v.getId()) { 
        case R.id.options:
                optionsPopup=showOptions(this);
            break;  
}
4

4 回答 4

119

我认为问题在于您只提供了一组动画样式。但实际上 aPopupWindow需要两个动画。一个将在显示窗口时使用,另一个用于隐藏窗口。

这就是你应该做的,

1) 创建两组不同的动画。

比如说,popup_show.xmlpopup_hide.xml并将其添加到您必须在res文件夹中创建的anim文件夹中。

2) 现在在values文件夹中创建一个名为styles.xml的 xml并像这样将这些动画添加到其中,

<style name="Animation">
    <item name="android:windowEnterAnimation">@anim/popup_show</item>
    <item name="android:windowExitAnimation">@anim/popup_hide</item>
</style>

3)现在将此样式设置为您的PopupWindow动画,

 popup.setAnimationStyle(R.style.Animation);

现在它会自动检测窗口进入和退出并提供所需的动画。

于 2012-09-15T11:07:53.513 回答
16

我正在使用带有此代码的弹出动画:

// Creating the PopupWindow
       layoutInflater = (LayoutInflater)     getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

       inflatedLayoutView = layoutInflater.inflate(R.layout.packages_popup,null);
     inflatedLayoutView.setAnimation(AnimationUtils.loadAnimation(this, R.animator.popupanim)


    popup_l = new PopupWindow(inflatedLayoutView);

   popup_l.setWidth(FrameLayout.LayoutParams.WRAP_CONTENT);
   popup_l.setHeight(FrameLayout.LayoutParams.WRAP_CONTENT);     
   popup_l.setFocusable(true);
   // Clear the default translucent background
   popup_l.setBackgroundDrawable(new BitmapDrawable());       

   popup_l.showAtLocation(parent, Gravity.CENTER, 0 , 0);   

   popup_l.setOutsideTouchable(false);

位于 /res/animator/popupanim.xml (popupanim.xml) 的动画代码是:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<alpha android:fromAlpha="0.0"
        android:toAlpha="1.0" 
        android:interpolator="@android:anim/accelerate_interpolator" 
        android:duration="500"
        android:repeatCount="0"/>
</set>
于 2013-09-11T12:13:09.267 回答
11

PopupWindow 自定义布局更方便,显示位置自由,没有任何限制。使用下面的代码并享受动画。在此动画中,使用底部滑入和滑出,但您只能更改滑入/滑出动画,并根据您的动画在应用程序中的任何位置设置动画,还有一件事,您必须更改重力 ->> BOTTOM、TOP 等。

动画资源文件夹:

1.slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false"
    >

  <translate
      android:duration="@integer/dialogplus_animation_default_duration"
      android:fromXDelta="0%"
      android:fromYDelta="100%"
      android:toXDelta="0%"
      android:toYDelta="0%"
      />
</set>

2.slide_out_bottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false"
    >

  <translate
      android:duration="@integer/dialogplus_animation_default_duration"
      android:fromXDelta="0%"
      android:fromYDelta="0%"
      android:toXDelta="0%"
      android:toYDelta="100%"
      />
</set>

风格:

<style name="popup_window_animation">
        <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
        <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
    </style>

方法:

 private PopupWindow showOptions(Context mcon){
        try{
            LayoutInflater inflater = (LayoutInflater) mcon.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            View layout = inflater.inflate(R.layout.popup_option_documents_type,null);
            PopupWindow optionspu = new PopupWindow(layout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.setAnimationStyle(R.style.popup_window_animation);
            optionspu.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
            optionspu.setFocusable(true);
            optionspu.setOutsideTouchable(true);
            optionspu.update(0, 0, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            optionspu.showAtLocation(layout, Gravity.BOTTOM, 0, 0);

            return optionspu;
        }
        catch (Exception e){e.printStackTrace();
            return null;}
    }
于 2018-05-29T10:29:35.717 回答
6

这可能有点晚了,但动画未显示的原因是因为您在设置动画之前显示了弹出窗口。

optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
optionspu.setAnimationStyle(R.anim.myanim);

将两行反转,您将看到动画:

optionspu.setAnimationStyle(R.anim.myanim);
optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
于 2015-09-21T08:36:02.937 回答