我上一篇文章讲解截安卓动画的最基本的东西,而怎么实现它们是要一个载体的。我这篇文章讲的就是其中一中实现方 式:popwindow.
popwindow直译过来就是突然出现的弹框,比如我们在任何一款app当中基本都有个头像,你点击它就会出现个弹框让你选择是拍照还是从系统中选择照片(这个内容我会在稍后的文章中详细讲解),而这个弹框就是popWindow了。
一.创建popwindow。
View popView = View.inflate(this, R.layout.popowindow_photo, null);popupWindow = new PopupWindow(popView,WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);popupWindow.setAnimationStyle(R.style.PopupAnimation); // 设置弹出动画ColorDrawable colorDrawable = new ColorDrawable(getResources().getColor(R.color.transparent));popupWindow.setBackgroundDrawable(colorDrawable);// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框// popupWindow.setBackgroundDrawable(new BitmapDrawable(// getApplicationContext().getResources(), Bitmap.createBitmap(1,// 1, Bitmap.Config.ARGB_8888)));popupWindow.setFocusable(true);// 设置PopupWindow可获得焦点popupWindow.setOutsideTouchable(true);// PopupWindow以外的区域是否可点击,点击后是否会消失。cancle = (Button) popView.findViewById(R.id.btn_cancle);cancle.setOnClickListener(this);photo = (TextView) popView.findViewById(R.id.photo_ing);photo.setOnClickListener(this);look = (TextView) popView.findViewById(R.id.photo_look);look.setOnClickListener(this);// popupWindow消失时监听popupWindow.setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss() {backgroundAlpaha(UserActivity.this, 1.0f);}});
R.layout.popowindow_photo是你显示给用户看的pipwindow界面。
R.style.PopupAnimation弹出的动画效果,在moudle的res/values/style.xml中创建<!-- popwindow的样式 --><style name="PopupAnimation" parent="android:Animation"><item name="android:windowEnterAnimation">@anim/popup_enter</item><item name="android:windowExitAnimation">@anim/popup_exit</item></style>
@anim/popup_enter就是我上篇文章提到的动画效果其中的一种。
android:windowEnterAnimation代表popWindow出现时的动画,android:windowExitAnimation代表popWindow消失时的动画。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" ><scaleandroid:duration="300"android:fromXScale="0.6"android:fromYScale="0.6"android:pivotX="50%"android:pivotY="50%"android:toXScale="1.0"android:toYScale="1.0" /><alphaandroid:duration="300"android:fromAlpha="0.0"android:interpolator="@android:anim/decelerate_interpolator"android:toAlpha="1.0" /></set>
popupWindow.setOnDismissListener(new OnDismissListener()这个是一个监听popWindow消失时事件,就是popWindow消失时改做啥!backgroundAlpaha(UserActivity.this, 1.0f)即我们都知道任何弹框的出现背景都会变暗,凸显dialog的“闪亮登场”/*** 设置添加屏幕的背景透明度*/public void backgroundAlpaha(Activity context, float bgAlpha) {WindowManager.LayoutParams lp = context.getWindow().getAttributes();lp.alpha = bgAlpha;context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);context.getWindow().setAttributes(lp);}
,popWindow也是一样的,我在他出现的时候将它设成
正常背景alpha(透明度)的一半,等它消失的时候在设回来。
二.popWindow的显示
/*** popwindow显示*/private void popWindow() {View rootView = findViewById(R.id.useractivity); // 设置当前根目录DisplayMetrics dm = getResources().getDisplayMetrics();int y = dm.heightPixels * 1 / 12;//相对位移,popwindow出现在距离底部整个屏幕1/12距离popupWindow.showAtLocation(rootView, Gravity.BOTTOM, 0, y);// popupWindow.update();//更新后显示,比如做了长宽缩小放大的处理backgroundAlpaha(this, 0.5f);}