網站首頁 編程語言 正文
本文實例為大家分享了Android開發Activity毛玻璃背景效果的具體代碼,供大家參考,具體內容如下
step1:先進行截屏操作
step2:進行毛玻璃處理
毛玻璃處理的原理為先通過縮小圖片,使其丟失一些像素點,接著進行模糊化處理,然后再放大到原來尺寸。由于圖片縮小后再進行模糊處理,需要處理的像素點和半徑都變小,從而使得模糊處理速度加快。?
創建的bitmap為原圖的1/8大小,接著,使用fastBlur來進行模糊化處理,最后設置背景,此時,背景圖會自動放大到初始大小。注意,由于這里進行了縮放,radius的取值也要比之前小得多(這里將原始取值除以8得到近似值2)。
它相對于renderScript方案來說,節省了拷貝bitmap到Allocation中,處理完后再拷貝回來的時間開銷。
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? ? xmlns:tools="http://schemas.android.com/tools" ? ? ? android:id="@+id/relative" ? ? ? android:layout_width="match_parent" ? ? ? android:layout_height="match_parent" ? ? ? android:background="@drawable/screenshot" > ? </RelativeLayout>
MainActivity:
package com.scott.blurdemo; ?
??
import android.annotation.TargetApi; ?
import android.app.Activity; ?
import android.graphics.Bitmap; ?
import android.graphics.Canvas; ?
import android.graphics.Paint; ?
import android.graphics.Rect; ?
import android.graphics.drawable.BitmapDrawable; ?
import android.os.Build; ?
import android.os.Bundle; ?
import android.support.v7.app.ActionBarActivity; ?
import android.util.Log; ?
import android.view.View; ?
??
@TargetApi(Build.VERSION_CODES.JELLY_BEAN) ?
public class MainActivity extends ActionBarActivity { ?
??
? ? private Bitmap bitmap; ?
??
? ? @Override ?
? ? protected void onCreate(Bundle savedInstanceState) { ?
? ? ? ? super.onCreate(savedInstanceState); ?
? ? ? ? setContentView(R.layout.activity_main); ?
? ? } ?
??
? ? @Override ?
? ? public void onWindowFocusChanged(boolean hasFocus) { ?
? ? ? ? super.onWindowFocusChanged(hasFocus); ?
? ? ? ? if (null == bitmap) { ?
? ? ? ? ? ? // 需要在actvity顯示出來后 再進行截屏操作。這里進行模糊化圖片是個耗時操作,建議在項目中放到非UI線程去做 ?
? ? ? ? ? ? bitmap = takeScreenShot(MainActivity.this); ?
? ? ? ? } ?
? ? ? ? ??
? ? ? ? if (bitmap != null) { ?
??
? ? ? ? ? ? ?blur(bitmap, findViewById(R.id.relative)); ?
? ? ? ? } ?
? ? } ?
??
? ? /**?
? ? ?* 屏幕截圖?
? ? ?* ?
? ? ?* @param activity?
? ? ?* @return?
? ? ?*/ ?
? ? private Bitmap takeScreenShot(Activity activity) { ?
? ? ? ? // View是你需要截圖的View ?
? ? ? ? View view = activity.getWindow().getDecorView(); ?
? ? ? ? view.setDrawingCacheEnabled(true); ?
? ? ? ? view.buildDrawingCache(); ?
? ? ? ? Bitmap b1 = view.getDrawingCache(); ?
??
? ? ? ? // 獲取狀態欄高度 ?
? ? ? ? Rect frame = new Rect(); ?
? ? ? ? activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); ?
? ? ? ? int statusBarHeight = frame.top; ?
??
? ? ? ? // 獲取屏幕長和高 ?
? ? ? ? int width = activity.getWindowManager().getDefaultDisplay().getWidth(); ?
? ? ? ? int height = activity.getWindowManager().getDefaultDisplay() ?
? ? ? ? ? ? ? ? .getHeight(); ?
? ? ? ? // 去掉標題欄 ?
? ? ? ? // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455); ?
? ? ? ? Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height ?
? ? ? ? ? ? ? ? - statusBarHeight); ?
? ? ? ? view.destroyDrawingCache(); ?
? ? ? ? return b; ?
? ? } ?
? ? ??
? ? ??
? ? private void blur(Bitmap bkg, View view) { ?
? ? ? ? long startMs = System.currentTimeMillis(); ?
? ? ? ? float radius = 2; ?
? ? ? ? float scaleFactor = 8; ?
??
? ? ? ? Bitmap overlay = Bitmap.createBitmap( ?
? ? ? ? ? ? ? ? (int) (view.getMeasuredWidth() / scaleFactor), ?
? ? ? ? ? ? ? ? (int) (view.getMeasuredHeight() / scaleFactor), ?
? ? ? ? ? ? ? ? Bitmap.Config.ARGB_8888); ?
? ? ? ? Canvas canvas = new Canvas(overlay); ?
? ? ? ? canvas.translate(-view.getLeft() / scaleFactor, -view.getTop() ?
? ? ? ? ? ? ? ? / scaleFactor); ?
? ? ? ? canvas.scale(1 / scaleFactor, 1 / scaleFactor); ?
? ? ? ? Paint paint = new Paint(); ?
? ? ? ? paint.setFlags(Paint.FILTER_BITMAP_FLAG); ?
? ? ? ? canvas.drawBitmap(bkg, 0, 0, paint); ?
? ? ? ? overlay = FastBlur.doBlur(overlay, (int) radius, true); ?
? ? ? ? view.setBackground(new BitmapDrawable(getResources(), overlay)); ?
? ? ? ? Log.e("Blur", "cost " + (System.currentTimeMillis() - startMs) + "ms"); ?
? ? } ?
} ?
FastBlur.java:
package com.scott.blurdemo; ?
??
import android.graphics.Bitmap; ?
??
public class FastBlur { ?
? ? public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { ?
? ? ? ? ? ?
? ? ? ? // Stack Blur v1.0 from ?
? ? ? ? // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html ?
? ? ? ? // ?
? ? ? ? // Java Author: Mario Klingemann <mario at="" quasimondo.com=""> ?
? ? ? ? // http://incubator.quasimondo.com ?
? ? ? ? // created Feburary 29, 2004 ?
? ? ? ? // Android port : Yahel Bouaziz <yahel at="" kayenko.com=""> ?
? ? ? ? // http://www.kayenko.com ?
? ? ? ? // ported april 5th, 2012 ?
? ?
? ? ? ? // This is a compromise between Gaussian Blur and Box blur ?
? ? ? ? // It creates much better looking blurs than Box Blur, but is ?
? ? ? ? // 7x faster than my Gaussian Blur implementation. ?
? ? ? ? // ?
? ? ? ? // I called it Stack Blur because this describes best how this ?
? ? ? ? // filter works internally: it creates a kind of moving stack ?
? ? ? ? // of colors whilst scanning through the image. Thereby it ?
? ? ? ? // just has to add one new block of color to the right side ?
? ? ? ? // of the stack and remove the leftmost color. The remaining ?
? ? ? ? // colors on the topmost layer of the stack are either added on ?
? ? ? ? // or reduced by one, depending on if they are on the right or ?
? ? ? ? // on the left side of the stack. ?
? ? ? ? // ?
? ? ? ? // If you are using this algorithm in your code please add ?
? ? ? ? // the following line: ?
? ? ? ? // ?
? ? ? ? // Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com> ?
? ?
? ? ? ? Bitmap bitmap; ?
? ? ? ? if (canReuseInBitmap) { ?
? ? ? ? ? ? bitmap = sentBitmap; ?
? ? ? ? } else { ?
? ? ? ? ? ? bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); ?
? ? ? ? } ?
? ?
? ? ? ? if (radius < 1) { ?
? ? ? ? ? ? return (null); ?
? ? ? ? } ?
? ?
? ? ? ? int w = bitmap.getWidth(); ?
? ? ? ? int h = bitmap.getHeight(); ?
? ?
? ? ? ? int[] pix = new int[w * h]; ?
? ? ? ? bitmap.getPixels(pix, 0, w, 0, 0, w, h); ?
? ?
? ? ? ? int wm = w - 1; ?
? ? ? ? int hm = h - 1; ?
? ? ? ? int wh = w * h; ?
? ? ? ? int div = radius + radius + 1; ?
? ?
? ? ? ? int r[] = new int[wh]; ?
? ? ? ? int g[] = new int[wh]; ?
? ? ? ? int b[] = new int[wh]; ?
? ? ? ? int rsum, gsum, bsum, x, y, i, p, yp, yi, yw; ?
? ? ? ? int vmin[] = new int[Math.max(w, h)]; ?
? ?
? ? ? ? int divsum = (div + 1) >> 1; ?
? ? ? ? divsum *= divsum; ?
? ? ? ? int dv[] = new int[256 * divsum]; ?
? ? ? ? for (i = 0; i < 256 * divsum; i++) { ?
? ? ? ? ? ? dv[i] = (i / divsum); ?
? ? ? ? } ?
? ?
? ? ? ? yw = yi = 0; ?
? ?
? ? ? ? int[][] stack = new int[div][3]; ?
? ? ? ? int stackpointer; ?
? ? ? ? int stackstart; ?
? ? ? ? int[] sir; ?
? ? ? ? int rbs; ?
? ? ? ? int r1 = radius + 1; ?
? ? ? ? int routsum, goutsum, boutsum; ?
? ? ? ? int rinsum, ginsum, binsum; ?
? ?
? ? ? ? for (y = 0; y < h; y++) { ?
? ? ? ? ? ? rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; ?
? ? ? ? ? ? for (i = -radius; i <= radius; i++) { ?
? ? ? ? ? ? ? ? p = pix[yi + Math.min(wm, Math.max(i, 0))]; ?
? ? ? ? ? ? ? ? sir = stack[i + radius]; ?
? ? ? ? ? ? ? ? sir[0] = (p & 0xff0000) >> 16; ?
? ? ? ? ? ? ? ? sir[1] = (p & 0x00ff00) >> 8; ?
? ? ? ? ? ? ? ? sir[2] = (p & 0x0000ff); ?
? ? ? ? ? ? ? ? rbs = r1 - Math.abs(i); ?
? ? ? ? ? ? ? ? rsum += sir[0] * rbs; ?
? ? ? ? ? ? ? ? gsum += sir[1] * rbs; ?
? ? ? ? ? ? ? ? bsum += sir[2] * rbs; ?
? ? ? ? ? ? ? ? if (i > 0) { ?
? ? ? ? ? ? ? ? ? ? rinsum += sir[0]; ?
? ? ? ? ? ? ? ? ? ? ginsum += sir[1]; ?
? ? ? ? ? ? ? ? ? ? binsum += sir[2]; ?
? ? ? ? ? ? ? ? } else { ?
? ? ? ? ? ? ? ? ? ? routsum += sir[0]; ?
? ? ? ? ? ? ? ? ? ? goutsum += sir[1]; ?
? ? ? ? ? ? ? ? ? ? boutsum += sir[2]; ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? } ?
? ? ? ? ? ? stackpointer = radius; ?
? ?
? ? ? ? ? ? for (x = 0; x < w; x++) { ?
? ?
? ? ? ? ? ? ? ? r[yi] = dv[rsum]; ?
? ? ? ? ? ? ? ? g[yi] = dv[gsum]; ?
? ? ? ? ? ? ? ? b[yi] = dv[bsum]; ?
? ?
? ? ? ? ? ? ? ? rsum -= routsum; ?
? ? ? ? ? ? ? ? gsum -= goutsum; ?
? ? ? ? ? ? ? ? bsum -= boutsum; ?
? ?
? ? ? ? ? ? ? ? stackstart = stackpointer - radius + div; ?
? ? ? ? ? ? ? ? sir = stack[stackstart % div]; ?
? ?
? ? ? ? ? ? ? ? routsum -= sir[0]; ?
? ? ? ? ? ? ? ? goutsum -= sir[1]; ?
? ? ? ? ? ? ? ? boutsum -= sir[2]; ?
? ?
? ? ? ? ? ? ? ? if (y == 0) { ?
? ? ? ? ? ? ? ? ? ? vmin[x] = Math.min(x + radius + 1, wm); ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? p = pix[yw + vmin[x]]; ?
? ?
? ? ? ? ? ? ? ? sir[0] = (p & 0xff0000) >> 16; ?
? ? ? ? ? ? ? ? sir[1] = (p & 0x00ff00) >> 8; ?
? ? ? ? ? ? ? ? sir[2] = (p & 0x0000ff); ?
? ?
? ? ? ? ? ? ? ? rinsum += sir[0]; ?
? ? ? ? ? ? ? ? ginsum += sir[1]; ?
? ? ? ? ? ? ? ? binsum += sir[2]; ?
? ?
? ? ? ? ? ? ? ? rsum += rinsum; ?
? ? ? ? ? ? ? ? gsum += ginsum; ?
? ? ? ? ? ? ? ? bsum += binsum; ?
? ?
? ? ? ? ? ? ? ? stackpointer = (stackpointer + 1) % div; ?
? ? ? ? ? ? ? ? sir = stack[(stackpointer) % div]; ?
? ?
? ? ? ? ? ? ? ? routsum += sir[0]; ?
? ? ? ? ? ? ? ? goutsum += sir[1]; ?
? ? ? ? ? ? ? ? boutsum += sir[2]; ?
? ?
? ? ? ? ? ? ? ? rinsum -= sir[0]; ?
? ? ? ? ? ? ? ? ginsum -= sir[1]; ?
? ? ? ? ? ? ? ? binsum -= sir[2]; ?
? ?
? ? ? ? ? ? ? ? yi++; ?
? ? ? ? ? ? } ?
? ? ? ? ? ? yw += w; ?
? ? ? ? } ?
? ? ? ? for (x = 0; x < w; x++) { ?
? ? ? ? ? ? rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; ?
? ? ? ? ? ? yp = -radius * w; ?
? ? ? ? ? ? for (i = -radius; i <= radius; i++) { ?
? ? ? ? ? ? ? ? yi = Math.max(0, yp) + x; ?
? ?
? ? ? ? ? ? ? ? sir = stack[i + radius]; ?
? ?
? ? ? ? ? ? ? ? sir[0] = r[yi]; ?
? ? ? ? ? ? ? ? sir[1] = g[yi]; ?
? ? ? ? ? ? ? ? sir[2] = b[yi]; ?
? ?
? ? ? ? ? ? ? ? rbs = r1 - Math.abs(i); ?
? ?
? ? ? ? ? ? ? ? rsum += r[yi] * rbs; ?
? ? ? ? ? ? ? ? gsum += g[yi] * rbs; ?
? ? ? ? ? ? ? ? bsum += b[yi] * rbs; ?
? ?
? ? ? ? ? ? ? ? if (i > 0) { ?
? ? ? ? ? ? ? ? ? ? rinsum += sir[0]; ?
? ? ? ? ? ? ? ? ? ? ginsum += sir[1]; ?
? ? ? ? ? ? ? ? ? ? binsum += sir[2]; ?
? ? ? ? ? ? ? ? } else { ?
? ? ? ? ? ? ? ? ? ? routsum += sir[0]; ?
? ? ? ? ? ? ? ? ? ? goutsum += sir[1]; ?
? ? ? ? ? ? ? ? ? ? boutsum += sir[2]; ?
? ? ? ? ? ? ? ? } ?
? ?
? ? ? ? ? ? ? ? if (i < hm) { ?
? ? ? ? ? ? ? ? ? ? yp += w; ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? } ?
? ? ? ? ? ? yi = x; ?
? ? ? ? ? ? stackpointer = radius; ?
? ? ? ? ? ? for (y = 0; y < h; y++) { ?
? ? ? ? ? ? ? ? // Preserve alpha channel: ( 0xff000000 & pix[yi] ) ?
? ? ? ? ? ? ? ? pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum]; ?
? ?
? ? ? ? ? ? ? ? rsum -= routsum; ?
? ? ? ? ? ? ? ? gsum -= goutsum; ?
? ? ? ? ? ? ? ? bsum -= boutsum; ?
? ?
? ? ? ? ? ? ? ? stackstart = stackpointer - radius + div; ?
? ? ? ? ? ? ? ? sir = stack[stackstart % div]; ?
? ?
? ? ? ? ? ? ? ? routsum -= sir[0]; ?
? ? ? ? ? ? ? ? goutsum -= sir[1]; ?
? ? ? ? ? ? ? ? boutsum -= sir[2]; ?
? ?
? ? ? ? ? ? ? ? if (x == 0) { ?
? ? ? ? ? ? ? ? ? ? vmin[y] = Math.min(y + r1, hm) * w; ?
? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? p = x + vmin[y]; ?
? ?
? ? ? ? ? ? ? ? sir[0] = r[p]; ?
? ? ? ? ? ? ? ? sir[1] = g[p]; ?
? ? ? ? ? ? ? ? sir[2] = b[p]; ?
? ?
? ? ? ? ? ? ? ? rinsum += sir[0]; ?
? ? ? ? ? ? ? ? ginsum += sir[1]; ?
? ? ? ? ? ? ? ? binsum += sir[2]; ?
? ?
? ? ? ? ? ? ? ? rsum += rinsum; ?
? ? ? ? ? ? ? ? gsum += ginsum; ?
? ? ? ? ? ? ? ? bsum += binsum; ?
? ?
? ? ? ? ? ? ? ? stackpointer = (stackpointer + 1) % div; ?
? ? ? ? ? ? ? ? sir = stack[stackpointer]; ?
? ?
? ? ? ? ? ? ? ? routsum += sir[0]; ?
? ? ? ? ? ? ? ? goutsum += sir[1]; ?
? ? ? ? ? ? ? ? boutsum += sir[2]; ?
? ?
? ? ? ? ? ? ? ? rinsum -= sir[0]; ?
? ? ? ? ? ? ? ? ginsum -= sir[1]; ?
? ? ? ? ? ? ? ? binsum -= sir[2]; ?
? ?
? ? ? ? ? ? ? ? yi += w; ?
? ? ? ? ? ? } ?
? ? ? ? } ?
? ?
? ? ? ? bitmap.setPixels(pix, 0, w, 0, 0, w, h); ?
? ?
? ? ? ? return (bitmap); ?
? ? } ?
} ?
原文鏈接:https://blog.csdn.net/Scotfield_msn/article/details/52492083
相關推薦
- 2022-04-23 Linux基于客戶端用戶密鑰登錄服務端用戶
- 2022-10-07 Qt入門學習之數據庫操作指南_C 語言
- 2023-06-03 redis中刪除操作命令_Redis
- 2023-05-22 解決Python報錯:ValueError:operands?could?not?be?broadc
- 2023-04-11 C#圖片處理如何生成縮略圖的實現_C#教程
- 2022-05-17 docker停止某個容器
- 2022-08-10 淺談Redis變慢的原因及排查方法_Redis
- 2022-08-13 404究竟是什么意思呢?像404,200,503等數字究竟是什么東西
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支