效果图如下:
代码如下:
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时会黑一下,不知道这个是怎么回事。
发表评论
-
ScrollView嵌套Edittext
2015-04-08 18:26 853scrollview 中加入多个控件如 edittext 后会 ... -
android 布局式跑马灯,非TextView
2015-04-07 10:51 511如题,简单的实现了跑马灯效果,把Scroll.java放入an ... -
Android圆角图片
2015-03-11 17:44 706my_wane_shape.xml 快速圆角背景边框实现, ... -
SQLite多线程读写实践及常见问题总结
2015-02-13 17:06 961基本操作的部分,大家都很熟悉了,这里根据个人切身经验,总结了一 ... -
android加速度感应
2015-01-19 10:25 14851.android测量数据 (1)android设备坐标系 ... -
MatrixCursor的使用
2015-01-19 09:49 1060ContentProvider对外共享数据的时候的query( ... -
Android 获取控件的宽高高级用法(MeasureSpec)
2015-01-15 14:23 1016一个MeasureSpec封装了父 ... -
Android_GridView_GridView概述及实现水平滑动
2015-01-14 17:14 11581.GridView简介 GridView是ViewGroup ... -
Android MMS,SMS之常用Uri
2014-09-19 16:32 1331Android MMS,SMS之常用Uri Android ... -
android短彩信查询以及MMS表结构
2014-09-19 16:31 2266android短信的数据库的Uri是不公开的, 读取起来时灰常 ... -
使用Android自带DownloadManager下载文件
2014-08-19 11:04 774SDK在API Level 9中加入了DownloadMan ... -
android textview里链接点击事件,增加图片
2014-08-07 16:45 1179Android系统默认给TextView插入图片提供了三种方 ... -
android Home事件汇总
2014-07-18 11:30 1020方法一:android 4.0以后无法通过更改页面的类型来 ... -
Android风格与主题(style and theme)
2014-07-16 16:35 683Android xml风格和主题文 ... -
Android中播放声音的两种方法
2014-05-30 15:09 683在Android中,音频、视 ... -
android 杀进程方法
2014-05-26 17:43 1027关闭应用的方法: 1.System.exit(0); ... -
android service 生命周期
2014-04-21 16:16 798有了 Service 类我们如何启动他呢,有两种方法: ... -
解决ADB端口被占用的问题
2014-04-21 16:14 844究其源就是adb server没启动 经过分析整理如下: ... -
输入法隐藏打开
2013-12-23 14:24 828首次进入activity,如果有个edittex ... -
google经纬度互转
2013-07-11 16:34 942https://developers.google.com/ ...
评论