我上一篇文章讲解截安卓动画的最基本的东西,而怎么实现它们是要一个载体的。我这篇文章讲的就是其中一中实现方 式: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() {
@Override
public 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" > <scale android:duration="300" android:fromXScale="0.6" android:fromYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" /> <alpha android: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);}