码迷,mamicode.com
首页 > 其他好文 > 详细

背景毛玻璃实现效果:高斯模糊

时间:2015-07-21 12:30:29      阅读:591      评论:0      收藏:0      [点我收藏+]

标签:

毛玻璃效果:高斯模糊实现
技术分享
这里是把新生成的页面以上一个页面为高斯模糊的底。
首先这里需要处理的一个问题是,上一个界面截屏。

1、获取上一界面的截图 :
  1. View view = activity.getWindow().getDecorView();
  2. view.setDrawingCacheEnabled(true);
  3. view.buildDrawingCache();
  4. Bitmap b1 = view.getDrawingCache();
DecorView是最顶端的View,在当前Activity中只有当运行到了onWindowFocusChanged的时候才能获取到View。
  1. public void onWindowFocusChanged(boolean hasFocus) {
  2. super.onWindowFocusChanged(hasFocus);
  3. View view = getWindow().getDecorView();
  4. view.setDrawingCacheEnabled(true);
  5. view.buildDrawingCache(true);
  6. blur(bmp1,bgLayout);
  7. }
在第二个Activity中使用Activity管理类获取上一个Activity的实例。需要做的去掉顶部的view。
  1. /**
  2. * 将一个Activity截图
  3. *
  4. * @param activity
  5. * @return
  6. */
  7. private Bitmap takeScreenShot(Activity activity) {
  8. View view = activity.getWindow().getDecorView();
  9. view.setDrawingCacheEnabled(true);
  10. view.buildDrawingCache();
  11. Bitmap b1 = view.getDrawingCache();
  12. // 获取状态栏高度
  13. Rect frame = new Rect();
  14. activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
  15. int statusBarHeight = frame.top;
  16. // 获取屏幕长和高
  17. DisplayMetrics dm = new DisplayMetrics();
  18. activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
  19. int width = dm.widthPixels;
  20. int height = dm.heightPixels;
  21. // 去掉标题栏
  22. Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
  23. - statusBarHeight);
  24. view.destroyDrawingCache();
  25. return b;
  26. }

2、做高斯模糊。
一般用的3种方法,第一种使用RenderScript;第二种使用开源的FastBlur;第三种使用的是优化了的FastBlur,即对FastBlur的
bitmap先放大尺寸再缩小,使其损失部分像素点,从而提高效率,避免OOM。所以推荐第三种。
  1. private void blur(Bitmap bkg, ViewGroup view) {
  2. long startMs = System.currentTimeMillis();
  3. float scaleFactor = 4;// 图片缩放比例;
  4. float radius = 20;// 模糊程度
  5. int width = (int) view.getMeasuredWidth();
  6. int height = (int) view.getMeasuredHeight();
  7. Bitmap overlay = Bitmap.createBitmap((int) (width / scaleFactor),
  8. (int) (height / scaleFactor), Bitmap.Config.ARGB_8888);
  9. Canvas canvas = new Canvas(overlay);
  10. canvas.translate(-view.getLeft() / scaleFactor, -view.getTop()
  11. / scaleFactor);
  12. canvas.scale(1 / scaleFactor, 1 / scaleFactor);
  13. Paint paint = new Paint();
  14. paint.setFlags(Paint.FILTER_BITMAP_FLAG);
  15. canvas.drawBitmap(bkg, 0, 0, paint);
  16. overlay = FastBlur.doBlur(overlay, (int) radius, true);
  17. view.setBackground(new BitmapDrawable(getResources(), overlay));
  18. /**
  19. * 打印高斯模糊处理时间,如果时间大约16ms,用户就能感到到卡顿,时间越长卡顿越明显,如果对模糊完图片要求不高,
  20. * 可是将scaleFactor设置大一些。
  21. */
  22. Log.i("jerome", "blur time:" + (System.currentTimeMillis() - startMs));
  23. }
blur的参数可以改成View或者ViewGroup,看情况,这个View是需要设置背景的控件。
还有一点。本方法放的位置:
onWindowFocusChaged方法里面;
或者是该View的回调事件使用;
或者onResume方法最后开线程300毫秒左右后获取宽和高 因为onResume执行完后300毫秒后 界面就显示出来了如onClick;

因为View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate()、onStrart()、onResume()
方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获
取的view没有被添加到DecorView上或者该View的visibility属性为gone 或者该view的width或height真的为0所以
只有上述条件都不成立时才能得到非0的width和height。

Demo:MaoGlassDemo
                        http://blog.csdn.net/nailsoul/article/details/25909313









背景毛玻璃实现效果:高斯模糊

标签:

原文地址:http://www.cnblogs.com/fruitbolgs/p/4663683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!