如何在android中为弹出窗口制作动画

时间:2012-02-12 09:35:36

标签: android android-popupwindow

我在我的应用程序中有一个弹出窗口,当点击某个按钮时会出现 我想在这个窗口中设置淡入淡出动画, 我将xml文件放在“res / anim”文件夹中并为弹出窗口设置动画样式但动画不起作用? 这是我的代码:

... myanim.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 个答案:

答案 0 :(得分:102)

我认为问题是你只提供了一套动画风格。但实际上PopupWindow需要两个动画。当显示窗口时将使用一个,而另一个则用于隐藏窗口。

这是你应该怎么做的,

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

说, popup_show.xml popup_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);

现在它会自动检测Window Enter和Exit并提供所需的动画。

答案 1 :(得分:13)

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

// 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>

答案 2 :(得分:5)

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

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

反转两行,你会看到动画:

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

答案 3 :(得分:4)

PopupWindow自定义布局更方便,显示位置自由没有任何限制。 使用下面的代码,享受动画。 在此动画中,使用底部幻灯片并向外滑动,但您只能更改幻灯片放入/缩小动画并根据动画在应用程序中的任何位置设置动画以及更多内容,您必须更改您的重力 - &gt;&gt; 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;}
    }