2015-02-11 88 views
1

我正在通過互聯網尋找一種方式來獲得LinearLayout背後的好模糊。 有很多圖書館(android-stackblur/BlurBehind/...),但它們大多模糊在活動級別,或需要模糊的圖像。視圖上的Android模糊

讓我覺得很複雜的是,我使用視頻作爲背景,並在LinearLayout底部有一些按鈕,如果我可以在LinearLayout上實現模糊,那將是非常好的。

有用的庫的任何提示?

回答

0

我必須作出的GoogleMap的模糊圖像,我用的是fastblur算法,是下一個:

public static Bitmap fastblur(Bitmap sentBitmap, int radius) 
{ 

// 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 <[email protected]> 

Bitmap 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]; 
Log.e("pix", w + " " + h + " " + pix.length); 
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; 
    } 
} 

Log.e("pix", w + " " + h + " " + pix.length); 
bitmap.setPixels(pix, 0, w, 0, 0, w, h); 

return (bitmap); 
} 

我認爲這是視頻不同,但對於一個地圖,你可以採取快照和它返回給你一個位圖:

private void captureMapScreen() 
{ 
    SnapshotReadyCallback callback = new SnapshotReadyCallback() 
    { 

    @Override 
    public void onSnapshotReady(Bitmap snapshot) 
    { 
     final Bitmap snap = snapshot; 

     Thread thread = new Thread(new Runnable() 
     { 

     @Override 
     public void run() 
     { 
      Bitmap blurTemplate = Bitmap.createScaledBitmap(snap, snap.getWidth()/10, snap.getHeight()/10, false); 

      final Bitmap image = MyApplication.fastblur(blurTemplate, 8); 

      getActivity().runOnUiThread(new Runnable() 
      { 

      @Override 
      public void run() 
      { 
       v_blur.setBackgroundDrawable(new BitmapDrawable(getActivity().getResources(), image)); 

      } 
      }); 

     } 
     }); 
     thread.start(); 
    } 
    }; 

    map.snapshot(callback); 

} 

你可以嘗試獲得你的視頻的快照,並嘗試我上面所說的。它並不適用於所有設備,例如華爲設備對於快照有點棘手。

我希望這可以幫助你。