欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開(kāi)發(fā)Activity毛玻璃背景效果

 更新時(shí)間:2022年08月10日 09:55:29   作者:Scofield_Phil  
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)Activity毛玻璃背景效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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)文章

最新評(píng)論