Android Activity 实时模糊效果

效果图如下:


代码如下:

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时会黑一下,不知道这个是怎么回事。

猜你喜欢

转载自f059074251.iteye.com/blog/1625409