效果图如下:
代码如下:
public class BlurWindow { private Window mWindow; private WindowManager mWindowManager; private View mEmptyView; public static final int START_BLUR = 0; public static final int STOP_BLUR = 1; private static final int EMPTY_SIZE = 0; private Handler mHandler = new Handler() { private boolean isAdd = false; public void handleMessage(android.os.Message msg) { switch (msg.what) { case START_BLUR: if (!isAdd) { WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.flags |= (LayoutParams.FLAG_BLUR_BEHIND | LayoutParams.FLAG_NOT_FOCUSABLE); lp.format = PixelFormat.TRANSPARENT; lp.width = EMPTY_SIZE; lp.height = EMPTY_SIZE; lp.type = LayoutParams.TYPE_APPLICATION; mWindowManager.addView(mEmptyView, lp); isAdd = true; } break; case STOP_BLUR: mWindowManager.removeView(mEmptyView); isAdd = false; break; default: break; } }; }; public BlurWindow(Activity activity) { mWindow = activity.getWindow(); mWindowManager = mWindow.getWindowManager(); mEmptyView = new View(activity); } public void startBlur() { mHandler.sendEmptyMessage(START_BLUR); } public void stopBLur() { mHandler.sendEmptyMessage(STOP_BLUR); } } //sleep 1.5s 然后模糊 再sleep2.0s 再去除模糊 public class BlurWindowActivity extends Activity { /** Called when the activity is first created. */ BlurWindow window; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); window = new BlurWindow(this); //startActivity(new Intent("com.test")); new Thread() { public void run() { try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } window.startBlur(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } window.stopBLur(); }; }.start(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } }
由于在activity中设置FLAG_BLUR_BEHIND无法立即生效,所以采用了addView这种方式促使它生效。FLAG_NOT_FOCUSABLE这个flag非常关键,如果不设置,将导致新加入的view获取了焦点,但无法控制包括返回按钮都不能用,需要你重新对window设置callback,参见Dialog的原代码。
lp.width = EMPTY_SIZE; lp.height = EMPTY_SIZE;
高度和宽度如果不设置为0,那就设置一下它的alpha为0或者fomat为TRANSPARENT,否则将会导致新加入的空的view充满全屏幕而且是黑的。
另外,需要注意的是,这个控制是和某个activity的window强相关的,所以只能用于某个actvity。
如果有更好的方法或者能对以上代码进行优化,欢迎大家共享出来。
如果这个代码是在activity生命周期中执行而不是延缓执行,比如在onCreate中进acitivty时会黑一下,不知道这个是怎么回事。