1.PopupWindow 简介
首先看android.widget.PopupWindow.java源码注释:
/** * <p>A popup window that can be used to display an arbitrary view. The popup * window is a floating container that appears on top of the current * activity.</p> * * @see android.widget.AutoCompleteTextView * @see android.widget.Spinner */PopupWindow是一个容器,用来存放任意view然后显示在当前activity的顶部。
再看PopupWindow是怎么显示的,调用显示的方法是
public void showAtLocation(IBinder token, int gravity, int x, int y) { if (isShowing() || mContentView == null) { return; } unregisterForScrollChanged(); mIsShowing = true; mIsDropdown = false; WindowManager.LayoutParams p = createPopupLayout(token); p.windowAnimations = computeAnimationResource();//计算当前赋值的窗口动画资源 preparePopup(p); if (gravity == Gravity.NO_GRAVITY) { gravity = Gravity.TOP | Gravity.START; } p.gravity = gravity; p.x = x; p.y = y; if (mHeightMode < 0) p.height = mLastHeight = mHeightMode; if (mWidthMode < 0) p.width = mLastWidth = mWidthMode; invokePopup(p); }在上面方法里面,WindowManager会通过方法computeAnimationResource()初始化PopupWindow所需要的动画资源:
private int computeAnimationResource() { if (mAnimationStyle == -1) { if (mIsDropdown) { return mAboveAnchor ? com.android.internal.R.style.Animation_DropDownUp : com.android.internal.R.style.Animation_DropDownDown;//系统默认的动画资源 } return 0; } return mAnimationStyle; }
由此可以看到PopupWindow是通过values/style.xml来配置动画效果的。这点和View是不同的,View的动画资源直接在values/anim/下配置。
PopupWindow本质上是通过WindowManager创建的一个window,然后在window里面放入了所需要显示的view,如果需要配置窗口级别的动画可以采用类似方式。
为此,PopupWindow提供了公开的设置动画资源的方法setAnimationStyle。
2.PopupWindow示例代码
附上示例:
public class PopupWindowAnimationActivity extends Activity implements OnClickListener{ ListPopupWindow mListPopupwindow; Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_popupwindow_animation); btn = (Button) this.findViewById(R.id.showPopupwindow); btn.setOnClickListener(this); mListPopupwindow = new ListPopupWindow(this); mListPopupwindow.setAnimationStyle(R.style.PopupAnimation); mListPopupwindow.setAnchorView(btn); String [] str = new String[]{"test1","test2"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1); adapter.addAll(str); mListPopupwindow.setAdapter(adapter); mListPopupwindow.setWidth(300); mListPopupwindow.setHeight(LayoutParams.WRAP_CONTENT); mListPopupwindow.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.more_menu_popup_bg)); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub int id = arg0.getId(); if(id == R.id.showPopupwindow){ mListPopupwindow.show(); } }
<style name="PopupAnimation" parent="android:Animation"> <item name="android:windowEnterAnimation">@anim/ani_in</item> <item name="android:windowExitAnimation">@anim/ani_out</item> </style>
3.示例下载
点击打开链接 https://github.com/zhhp1121/AndroidAnimationTeam.git