package com.xiaomi.xms.sales.widget; import android.content.Context; import android.graphics.Canvas; import android.os.Handler; import android.support.v4.view.ViewPager.LayoutParams; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.PopupWindow; import com.xiaomi.xms.sales.R; public class MenuPopupWindow extends PopupWindow { private static final int BACKGROUND_COLOR = 0x99000000; private Context mContext; private View mContentView; private FrameLayout mRootPanel; public View mCoverView; public MenuPopupWindow(Context context, View contentView) { super(contentView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); mContext = context; mContentView = contentView; mRootPanel = new RootPanel(mContext); if (mCoverView == null) { mCoverView = new LinearLayout(mRootPanel.getContext()); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); mCoverView.setBackgroundColor(BACKGROUND_COLOR); mRootPanel.addView(mCoverView, lp); } FrameLayout.LayoutParams r = new FrameLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); r.gravity = Gravity.BOTTOM; mRootPanel.addView(contentView, r); setContentView(mRootPanel); setFocusable(true); setBackgroundDrawable(context.getResources().getDrawable(android.R.color.transparent)); setOutsideTouchable(true); mCoverView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isShowing()) { dismiss(); } } }); mRootPanel.setFocusableInTouchMode(true); mRootPanel.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View view, int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_MENU) && (isShowing())) { if (event.getAction() == KeyEvent.ACTION_UP) { dismiss(); return true; } } return false; } }); } @Override public void dismiss() { Animation menuMoveDown = AnimationUtils.loadAnimation(mContext, R.anim.menu_exit); Animation bgDisappear = AnimationUtils.loadAnimation(mContext, R.anim.disappear); mCoverView.startAnimation(bgDisappear); mContentView.startAnimation(menuMoveDown); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MenuPopupWindow.super.dismiss(); } }, 300); } @Override public void showAsDropDown(View anchor, int xoff, int yoff) { super.showAsDropDown(anchor, xoff, yoff); mContentView.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.menu_enter)); mCoverView.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.appear)); } @Override public void showAtLocation(View anchor, int gravity, int x, int y) { if(anchor == null){ return; } super.showAtLocation(anchor, gravity, x, y); mContentView.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.menu_enter)); mCoverView.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.appear)); } private class RootPanel extends FrameLayout { public RootPanel(Context context) { super(context); setClickable(true); } @Override public void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); } // Override performClick rather than set clickListener to avoid sound effect @Override public boolean performClick() { dismiss(); return true; } } }