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

Ish*_*haq 44 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>
Run Code Online (Sandbox Code Playgroud)

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

创建弹出窗口

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;}
}
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*lva 109

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

这是你应该怎么做的,

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

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

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

<style name="Animation">
    <item name="android:windowEnterAnimation">@anim/popup_show</item>
    <item name="android:windowExitAnimation">@anim/popup_hide</item>
</style>
Run Code Online (Sandbox Code Playgroud)

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

 popup.setAnimationStyle(R.style.Animation);
Run Code Online (Sandbox Code Playgroud)

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


aim*_*ano 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);
Run Code Online (Sandbox Code Playgroud)

位于/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>
Run Code Online (Sandbox Code Playgroud)


Kun*_*ish 10

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

风格:

<style name="popup_window_animation">
        <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
        <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
    </style>
Run Code Online (Sandbox Code Playgroud)

方法:

 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;}
    }
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 5

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

optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
optionspu.setAnimationStyle(R.anim.myanim);
Run Code Online (Sandbox Code Playgroud)

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

optionspu.setAnimationStyle(R.anim.myanim);
optionspu.showAtLocation(layout, Gravity.TOP, 0, 0);
Run Code Online (Sandbox Code Playgroud)