Advertisement
Guest User

Untitled

a guest
Dec 11th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.85 KB | None | 0 0
  1. import java.lang.ref.WeakReference;
  2. import java.util.InputMismatchException;
  3. import android.graphics.Bitmap;
  4. import android.graphics.Canvas;
  5. import android.graphics.ColorFilter;
  6. import android.graphics.Paint;
  7. import android.graphics.PixelFormat;
  8. import android.graphics.drawable.Drawable;
  9. import android.util.Log;
  10. import android.view.View;
  11.  
  12.  
  13. /**
  14. * A drawable that draws the target view as blurred using fast blur
  15. * <p/>
  16. * <p/>
  17. * TODO:we might use setBounds() to draw only part a of the target view
  18. * <p/>
  19. * Created by 10uR on 24.5.2014.
  20. */
  21. public class BlurDrawable extends Drawable {
  22.  
  23. private WeakReference<View> targetRef;
  24. private Bitmap blurred;
  25. private Paint paint;
  26. private int radius;
  27.  
  28.  
  29. public BlurDrawable(View target) {
  30. this(target, 10);
  31. }
  32.  
  33.  
  34. public BlurDrawable(View target, int radius) {
  35. this.targetRef = new WeakReference<View>(target);
  36. setRadius(radius);
  37. target.setDrawingCacheEnabled(true);
  38. target.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_AUTO);
  39. paint = new Paint();
  40. paint.setAntiAlias(true);
  41. paint.setFilterBitmap(true);
  42. }
  43.  
  44.  
  45. @Override
  46. public void draw(Canvas canvas) {
  47. if (blurred == null) {
  48. View target = targetRef.get();
  49. if (target != null) {
  50. Bitmap bitmap = target.getDrawingCache(true);
  51. if (bitmap == null)
  52. return;
  53. blurred = fastBlur(bitmap, radius);
  54. }
  55. }
  56. if (blurred != null && !blurred.isRecycled())
  57. canvas.drawBitmap(blurred, 0, 0, paint);
  58. }
  59.  
  60.  
  61. /**
  62. * Set the bluring radius that will be applied to target view's bitmap
  63. *
  64. * @param radius should be 0-100
  65. */
  66. public void setRadius(int radius) {
  67. if (radius < 0 || radius > 100)
  68. throw new InputMismatchException("Radius must be 0 <= radius <= 100 !");
  69. this.radius = radius;
  70. if (blurred != null) {
  71. blurred.recycle();
  72. blurred = null;
  73. }
  74. invalidateSelf();
  75. }
  76.  
  77.  
  78. public int getRadius() {
  79. return radius;
  80. }
  81.  
  82.  
  83. @Override
  84. public void setAlpha(int alpha) {}
  85.  
  86.  
  87. @Override
  88. public void setColorFilter(ColorFilter cf) {
  89.  
  90. }
  91.  
  92.  
  93. @Override
  94. public int getOpacity() {
  95. return PixelFormat.TRANSLUCENT;
  96. }
  97.  
  98.  
  99. /**
  100. * from http://stackoverflow.com/a/10028267/3133545
  101. * <p/>
  102. * <p/>
  103. * <p/>
  104. * Stack Blur v1.0 from http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
  105. * <p/>
  106. * Java Author: Mario Klingemann <mario at quasimondo.com> http://incubator.quasimondo.com created Feburary 29, 2004 Android port : Yahel Bouaziz <yahel at
  107. * kayenko.com> http://www.kayenko.com ported april 5th, 2012
  108. * <p/>
  109. * 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
  110. * implementation.
  111. * <p/>
  112. * 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
  113. * 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
  114. * 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.
  115. * <p/>
  116. * If you are using this algorithm in your code please add the following line:
  117. * <p/>
  118. * Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com>
  119. */
  120. private static Bitmap fastBlur(Bitmap sentBitmap, int radius) {
  121.  
  122. Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
  123.  
  124. if (radius < 1) {
  125. return (null);
  126. }
  127.  
  128. int w = bitmap.getWidth();
  129. int h = bitmap.getHeight();
  130.  
  131. int[] pix = new int[w * h];
  132. Log.e("pix", w + " " + h + " " + pix.length);
  133. bitmap.getPixels(pix, 0, w, 0, 0, w, h);
  134.  
  135. int wm = w - 1;
  136. int hm = h - 1;
  137. int wh = w * h;
  138. int div = radius + radius + 1;
  139.  
  140. int r[] = new int[wh];
  141. int g[] = new int[wh];
  142. int b[] = new int[wh];
  143. int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
  144. int vmin[] = new int[Math.max(w, h)];
  145.  
  146. int divsum = (div + 1) >> 1;
  147. divsum *= divsum;
  148. int dv[] = new int[256 * divsum];
  149. for (i = 0; i < 256 * divsum; i++) {
  150. dv[i] = (i / divsum);
  151. }
  152.  
  153. yw = yi = 0;
  154.  
  155. int[][] stack = new int[div][3];
  156. int stackpointer;
  157. int stackstart;
  158. int[] sir;
  159. int rbs;
  160. int r1 = radius + 1;
  161. int routsum, goutsum, boutsum;
  162. int rinsum, ginsum, binsum;
  163.  
  164. for (y = 0; y < h; y++) {
  165. rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  166. for (i = -radius; i <= radius; i++) {
  167. p = pix[yi + Math.min(wm, Math.max(i, 0))];
  168. sir = stack[i + radius];
  169. sir[0] = (p & 0xff0000) >> 16;
  170. sir[1] = (p & 0x00ff00) >> 8;
  171. sir[2] = (p & 0x0000ff);
  172. rbs = r1 - Math.abs(i);
  173. rsum += sir[0] * rbs;
  174. gsum += sir[1] * rbs;
  175. bsum += sir[2] * rbs;
  176. if (i > 0) {
  177. rinsum += sir[0];
  178. ginsum += sir[1];
  179. binsum += sir[2];
  180. } else {
  181. routsum += sir[0];
  182. goutsum += sir[1];
  183. boutsum += sir[2];
  184. }
  185. }
  186. stackpointer = radius;
  187.  
  188. for (x = 0; x < w; x++) {
  189.  
  190. r[yi] = dv[rsum];
  191. g[yi] = dv[gsum];
  192. b[yi] = dv[bsum];
  193.  
  194. rsum -= routsum;
  195. gsum -= goutsum;
  196. bsum -= boutsum;
  197.  
  198. stackstart = stackpointer - radius + div;
  199. sir = stack[stackstart % div];
  200.  
  201. routsum -= sir[0];
  202. goutsum -= sir[1];
  203. boutsum -= sir[2];
  204.  
  205. if (y == 0) {
  206. vmin[x] = Math.min(x + radius + 1, wm);
  207. }
  208. p = pix[yw + vmin[x]];
  209.  
  210. sir[0] = (p & 0xff0000) >> 16;
  211. sir[1] = (p & 0x00ff00) >> 8;
  212. sir[2] = (p & 0x0000ff);
  213.  
  214. rinsum += sir[0];
  215. ginsum += sir[1];
  216. binsum += sir[2];
  217.  
  218. rsum += rinsum;
  219. gsum += ginsum;
  220. bsum += binsum;
  221.  
  222. stackpointer = (stackpointer + 1) % div;
  223. sir = stack[(stackpointer) % div];
  224.  
  225. routsum += sir[0];
  226. goutsum += sir[1];
  227. boutsum += sir[2];
  228.  
  229. rinsum -= sir[0];
  230. ginsum -= sir[1];
  231. binsum -= sir[2];
  232.  
  233. yi++;
  234. }
  235. yw += w;
  236. }
  237. for (x = 0; x < w; x++) {
  238. rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  239. yp = -radius * w;
  240. for (i = -radius; i <= radius; i++) {
  241. yi = Math.max(0, yp) + x;
  242.  
  243. sir = stack[i + radius];
  244.  
  245. sir[0] = r[yi];
  246. sir[1] = g[yi];
  247. sir[2] = b[yi];
  248.  
  249. rbs = r1 - Math.abs(i);
  250.  
  251. rsum += r[yi] * rbs;
  252. gsum += g[yi] * rbs;
  253. bsum += b[yi] * rbs;
  254.  
  255. if (i > 0) {
  256. rinsum += sir[0];
  257. ginsum += sir[1];
  258. binsum += sir[2];
  259. } else {
  260. routsum += sir[0];
  261. goutsum += sir[1];
  262. boutsum += sir[2];
  263. }
  264.  
  265. if (i < hm) {
  266. yp += w;
  267. }
  268. }
  269. yi = x;
  270. stackpointer = radius;
  271. for (y = 0; y < h; y++) {
  272. // Preserve alpha channel: ( 0xff000000 & pix[yi] )
  273. pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
  274.  
  275. rsum -= routsum;
  276. gsum -= goutsum;
  277. bsum -= boutsum;
  278.  
  279. stackstart = stackpointer - radius + div;
  280. sir = stack[stackstart % div];
  281.  
  282. routsum -= sir[0];
  283. goutsum -= sir[1];
  284. boutsum -= sir[2];
  285.  
  286. if (x == 0) {
  287. vmin[y] = Math.min(y + r1, hm) * w;
  288. }
  289. p = x + vmin[y];
  290.  
  291. sir[0] = r[p];
  292. sir[1] = g[p];
  293. sir[2] = b[p];
  294.  
  295. rinsum += sir[0];
  296. ginsum += sir[1];
  297. binsum += sir[2];
  298.  
  299. rsum += rinsum;
  300. gsum += ginsum;
  301. bsum += binsum;
  302.  
  303. stackpointer = (stackpointer + 1) % div;
  304. sir = stack[stackpointer];
  305.  
  306. routsum += sir[0];
  307. goutsum += sir[1];
  308. boutsum += sir[2];
  309.  
  310. rinsum -= sir[0];
  311. ginsum -= sir[1];
  312. binsum -= sir[2];
  313.  
  314. yi += w;
  315. }
  316. }
  317.  
  318. bitmap.setPixels(pix, 0, w, 0, 0, w, h);
  319.  
  320. return (bitmap);
  321. }
  322.  
  323. }
  324.  
  325. mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
  326. R.drawable.menu, R.string.drawer_open, R.string.drawer_close) {
  327.  
  328. /* Called when drawer is closed */
  329. public void onDrawerClosed(View view) {
  330.  
  331. }
  332.  
  333.  
  334. /* Called when a drawer is opened */
  335. public void onDrawerOpened(View drawerView) {
  336. View view = findViewById(android.R.id.content);
  337. BlurDrawable blurDrawable = new BlurDrawable(view, 40);
  338. drawerView.setBackgroundDrawable(blurDrawable);
  339. }
  340. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement