Android開(kāi)發(fā)Activity毛玻璃背景效果
本文實(shí)例為大家分享了Android開(kāi)發(fā)Activity毛玻璃背景效果的具體代碼,供大家參考,具體內(nèi)容如下
step1:先進(jìn)行截屏操作
step2:進(jìn)行毛玻璃處理
毛玻璃處理的原理為先通過(guò)縮小圖片,使其丟失一些像素點(diǎn),接著進(jìn)行模糊化處理,然后再放大到原來(lái)尺寸。由于圖片縮小后再進(jìn)行模糊處理,需要處理的像素點(diǎn)和半徑都變小,從而使得模糊處理速度加快。
創(chuàng)建的bitmap為原圖的1/8大小,接著,使用fastBlur來(lái)進(jìn)行模糊化處理,最后設(shè)置背景,此時(shí),背景圖會(huì)自動(dòng)放大到初始大小。注意,由于這里進(jìn)行了縮放,radius的取值也要比之前小得多(這里將原始取值除以8得到近似值2)。
它相對(duì)于renderScript方案來(lái)說(shuō),節(jié)省了拷貝bitmap到Allocation中,處理完后再拷貝回來(lái)的時(shí)間開(kāi)銷。
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顯示出來(lái)后 再進(jìn)行截屏操作。這里進(jìn)行模糊化圖片是個(gè)耗時(shí)操作,建議在項(xiàng)目中放到非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(); ? ?? ? ? ? ? // 獲取狀態(tài)欄高度 ? ? ? ? ? Rect frame = new Rect(); ? ? ? ? ? activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); ? ? ? ? ? int statusBarHeight = frame.top; ? ?? ? ? ? ? // 獲取屏幕長(zhǎng)和高 ? ? ? ? ? int width = activity.getWindowManager().getDefaultDisplay().getWidth(); ? ? ? ? ? int height = activity.getWindowManager().getDefaultDisplay() ? ? ? ? ? ? ? ? ? .getHeight(); ? ? ? ? ? // 去掉標(biāo)題欄 ? ? ? ? ? // 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); ? ? ? } ? } ?
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開(kāi)發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(一)
這篇文章主要介紹了Android開(kāi)發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(一) 的相關(guān)資料,需要的朋友可以參考下2016-01-01Android?Studio實(shí)現(xiàn)購(gòu)買售賣系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)購(gòu)買售賣系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02android界面布局之實(shí)現(xiàn)文本塊布局效果示例
這篇文章主要介紹了android實(shí)現(xiàn)文本塊布局效果示例,需要的朋友可以參考下2014-04-04Android自定義View實(shí)現(xiàn)葉子飄動(dòng)旋轉(zhuǎn)效果(四)
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)葉子飄動(dòng)旋轉(zhuǎn)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03android通過(guò)google api獲取天氣信息示例
這篇文章主要介紹了android通過(guò)google api獲取天氣信息示例,需要的朋友可以參考下2014-04-04Android 顯示和隱藏輸入法實(shí)現(xiàn)代碼
本文所要介紹的這個(gè)方法可以轉(zhuǎn)換軟件輸入法在窗體中的顯示狀態(tài),具體實(shí)現(xiàn)代碼如下,感興趣的你可以參考下哈,希望可以幫助到你2013-03-03Android使用開(kāi)源框架ANDROID-IMAGE-INDICATOR實(shí)現(xiàn)圖片輪播部署
這篇文章主要為大家詳細(xì)介紹了Android使用開(kāi)源框架ANDROID-IMAGE-INDICATOR實(shí)現(xiàn)圖片輪播部署,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android自定義滾動(dòng)選擇器實(shí)例代碼
本篇文章主要介紹了Android自定義滾動(dòng)選擇器實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01Flutter綜合部分頁(yè)面詳情頁(yè)實(shí)現(xiàn)過(guò)程示例
這篇文章主要為大家介紹了Flutter綜合部分頁(yè)面詳情頁(yè)實(shí)現(xiàn)過(guò)程步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08