樂樂音樂播放器(六) 仿酷狗的左滑菜單

源碼下載:http://www.eoeandroid.com/thread-588446-1-1.html

該功能主要是使用開源的SlidingMenu來實現的,其中盜用了這篇文章的大部分代碼,http://blog.csdn.net/xinayida/article/details/40614835


不過他是右滑動的,我修改了一下,弄了一個左滑動的,併爲背景圖片添加了 模糊 效果


修改代碼如下:

  1. package com.happy.ui;

  2. import java.io.InputStream;

  3. import android.app.Activity;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.drawable.BitmapDrawable;
  8. import android.graphics.drawable.Drawable;
  9. import android.os.AsyncTask;
  10. import android.os.Bundle;

  11. import com.happy.logger.LoggerManage;
  12. import com.happy.slidingmenu.SlidingMenu;
  13. import com.happy.slidingmenu.SlidingMenu.CanvasTransformer;
  14. import com.happy.util.FastBlur;
  15. import com.happy.util.ImageUtil;

  16. public class MainActivity extends Activity {

  17.         private LoggerManage logger;

  18.         private SlidingMenu slidingMenu;

  19.         @Override
  20.         public void onCreate(Bundle savedInstanceState) {
  21.                 super.onCreate(savedInstanceState);
  22.                 setContentView(R.layout.activity_main);
  23.                 init();
  24.         }

  25.         private void init() {
  26.                 logger = LoggerManage.getZhangLogger(this);

  27.                 slidingMenu = (SlidingMenu) findViewById(R.id.slidingMenu);

  28.                 slidingMenu.setMode(SlidingMenu.RIGHT);// 設置滑動的方向 向左 、向右或向左向右
  29.                 slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//
  30.                 // 設置從哪裏可以觸發滑動效果:全屏、邊界、不可以
  31.                 slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);

  32.                 slidingMenu.setContent(R.layout.slidmenu_mainview);
  33.                 slidingMenu.setMenu(R.layout.slidmenu_menu);

  34.                 slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);

  35.                 slidingMenu.setFadeDegree(0f);// menu的漸隱效果係數(0-1)
  36.                 slidingMenu.setBehindScrollScale(0f);// 主頁面移動1個像素,menu移動0.1個像素
  37.                 slidingMenu.setAboveCanvasTransformer(new CanvasTransformer() {

  38.                         @Override
  39.                         public void transformCanvas(Canvas canvas, float percentOpen) {
  40.                                 // percentOpen從0變到1,原圖從1倍大小縮小到3/4
  41.                                 float scale = (float) (1.0 - 0.25 * percentOpen);
  42.                                 // x,y方向同時放大,動畫的相對中心定在“右中”
  43.                                 canvas.scale(scale, scale, canvas.getWidth(),
  44.                                                 canvas.getHeight() / 2);
  45.                         }
  46.                 });

  47.                 slidingMenu.setBehindCanvasTransformer(new CanvasTransformer() {

  48.                         @Override
  49.                         public void transformCanvas(Canvas canvas, float percentOpen) {
  50.                                 // // 原圖從3/4增加到1倍大小
  51.                                 // float scale = (float) (0.75 + 0.25 * percentOpen);
  52.                                 // // x座標先向屏幕右邊移動3/4的視圖寬度,然後再慢慢移動到0,這樣來實現從屏幕右邊移動進屏幕的效果
  53.                                 // canvas.translate(3 * canvas.getWidth() / 4 - 3 * percentOpen
  54.                                 // * canvas.getWidth() / 4, 0);
  55.                                 // // x,y方向同時縮小,動畫的相對中心定在“左中”,這樣就不至於縮放的時候屏幕左邊出現一條空白。
  56.                                 // canvas.scale(scale, scale, 0, canvas.getHeight() / 2);

  57.                                 float scale = (float) (percentOpen * 0.25 + 0.75);
  58.                                 canvas.scale(scale, scale, canvas.getWidth(),
  59.                                                 canvas.getHeight() / 2);

  60.                         }
  61.                 });

  62.                  BitmapFactory.Options opt = new BitmapFactory.Options();
  63.                  opt.inPreferredConfig = Bitmap.Config.RGB_565;// 表示16位位圖
  64.                  // 565代表對應三原色佔的位數
  65.                  opt.inInputShareable = true;
  66.                  opt.inPurgeable = true;// 設置圖片可以被回收
  67.                  InputStream is = getResources().openRawResource(
  68.                  R.drawable.bg_skin_thumb3);
  69.                  Bitmap bmp = BitmapFactory.decodeStream(is, null, opt);
  70.                  //將 immutable bitmap 轉爲 mutable bitmap 防止報 java.lang.IllegalStateException        at android.graphics.Bitmap.setPixels(Bitmap.java:1461)
  71.                  //具體可以參考 http://www.educity.cn/wenda/155359.html
  72.                  
  73.                  Bitmap bmp2 =  Bitmap.createScaledBitmap(bmp, 480, 320,false);
  74.                 // Drawable drawable = ImageUtil.boxBlurFilter(bmp);
  75.                 // new AsyncTask<String, Integer, String>() {
  76.                 //
  77.                 // @Override
  78.                 // protected String doInBackground(String... params) {
  79. //                final Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
  80. //                                R.drawable.bg_skin_thumb3);
  81.                  //添加圖片模糊
  82.                 Bitmap drawable = FastBlur.doBlur(bmp2, 20, true);
  83.                 slidingMenu.setBackground(new BitmapDrawable(drawable));
  84.                 // return null;
  85.                 // }
  86.                 // }.execute("");

  87.         }

  88. }
複製代碼
圖片模糊處理
  1. package com.happy.util;

  2. import android.graphics.Bitmap;

  3. /**
  4. * Created by paveld on 3/6/14.
  5. */
  6. public class FastBlur {

  7.     public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {

  8.         // Stack Blur v1.0 from
  9.         // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
  10.         //
  11.         // Java Author: Mario Klingemann 
  12.         // http://incubator.quasimondo.com
  13.         // created Feburary 29, 2004
  14.         // Android port : Yahel Bouaziz 
  15.         // http://www.kayenko.com
  16.         // ported april 5th, 2012

  17.         // This is a compromise between Gaussian Blur and Box blur
  18.         // It creates much better looking blurs than Box Blur, but is
  19.         // 7x faster than my Gaussian Blur implementation.
  20.         //
  21.         // I called it Stack Blur because this describes best how this
  22.         // filter works internally: it creates a kind of moving stack
  23.         // of colors whilst scanning through the image. Thereby it
  24.         // just has to add one new block of color to the right side
  25.         // of the stack and remove the leftmost color. The remaining
  26.         // colors on the topmost layer of the stack are either added on
  27.         // or reduced by one, depending on if they are on the right or
  28.         // on the left side of the stack.
  29.         //
  30.         // If you are using this algorithm in your code please add
  31.         // the following line:
  32.         //
  33.         // Stack Blur Algorithm by Mario Klingemann 

  34.         Bitmap bitmap;
  35.         if (canReuseInBitmap) {
  36.             bitmap = sentBitmap;
  37.         } else {
  38.             bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
  39.         }

  40.         if (radius < 1) {
  41.             return (null);
  42.         }

  43.         int w = bitmap.getWidth();
  44.         int h = bitmap.getHeight();

  45.         int[] pix = new int[w * h];
  46.         bitmap.getPixels(pix, 0, w, 0, 0, w, h);

  47.         int wm = w - 1;
  48.         int hm = h - 1;
  49.         int wh = w * h;
  50.         int div = radius + radius + 1;

  51.         int r[] = new int[wh];
  52.         int g[] = new int[wh];
  53.         int b[] = new int[wh];
  54.         int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
  55.         int vmin[] = new int[Math.max(w, h)];

  56.         int divsum = (div + 1) >> 1;
  57.         divsum *= divsum;
  58.         int dv[] = new int[256 * divsum];
  59.         for (i = 0; i < 256 * divsum; i++) {
  60.             dv[i] = (i / divsum);
  61.         }

  62.         yw = yi = 0;

  63.         int[][] stack = new int[div][3];
  64.         int stackpointer;
  65.         int stackstart;
  66.         int[] sir;
  67.         int rbs;
  68.         int r1 = radius + 1;
  69.         int routsum, goutsum, boutsum;
  70.         int rinsum, ginsum, binsum;

  71.         for (y = 0; y < h; y++) {
  72.             rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  73.             for (i = -radius; i <= radius; i++) {
  74.                 p = pix[yi + Math.min(wm, Math.max(i, 0))];
  75.                 sir = stack[i + radius];
  76.                 sir[0] = (p & 0xff0000) >> 16;
  77.                 sir[1] = (p & 0x00ff00) >> 8;
  78.                 sir[2] = (p & 0x0000ff);
  79.                 rbs = r1 - Math.abs(i);
  80.                 rsum += sir[0] * rbs;
  81.                 gsum += sir[1] * rbs;
  82.                 bsum += sir[2] * rbs;
  83.                 if (i > 0) {
  84.                     rinsum += sir[0];
  85.                     ginsum += sir[1];
  86.                     binsum += sir[2];
  87.                 } else {
  88.                     routsum += sir[0];
  89.                     goutsum += sir[1];
  90.                     boutsum += sir[2];
  91.                 }
  92.             }
  93.             stackpointer = radius;

  94.             for (x = 0; x < w; x++) {

  95.                 r[yi] = dv[rsum];
  96.                 g[yi] = dv[gsum];
  97.                 b[yi] = dv[bsum];

  98.                 rsum -= routsum;
  99.                 gsum -= goutsum;
  100.                 bsum -= boutsum;

  101.                 stackstart = stackpointer - radius + div;
  102.                 sir = stack[stackstart % div];

  103.                 routsum -= sir[0];
  104.                 goutsum -= sir[1];
  105.                 boutsum -= sir[2];

  106.                 if (y == 0) {
  107.                     vmin[x] = Math.min(x + radius + 1, wm);
  108.                 }
  109.                 p = pix[yw + vmin[x]];

  110.                 sir[0] = (p & 0xff0000) >> 16;
  111.                 sir[1] = (p & 0x00ff00) >> 8;
  112.                 sir[2] = (p & 0x0000ff);

  113.                 rinsum += sir[0];
  114.                 ginsum += sir[1];
  115.                 binsum += sir[2];

  116.                 rsum += rinsum;
  117.                 gsum += ginsum;
  118.                 bsum += binsum;

  119.                 stackpointer = (stackpointer + 1) % div;
  120.                 sir = stack[(stackpointer) % div];

  121.                 routsum += sir[0];
  122.                 goutsum += sir[1];
  123.                 boutsum += sir[2];

  124.                 rinsum -= sir[0];
  125.                 ginsum -= sir[1];
  126.                 binsum -= sir[2];

  127.                 yi++;
  128.             }
  129.             yw += w;
  130.         }
  131.         for (x = 0; x < w; x++) {
  132.             rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  133.             yp = -radius * w;
  134.             for (i = -radius; i <= radius; i++) {
  135.                 yi = Math.max(0, yp) + x;

  136.                 sir = stack[i + radius];

  137.                 sir[0] = r[yi];
  138.                 sir[1] = g[yi];
  139.                 sir[2] = b[yi];

  140.                 rbs = r1 - Math.abs(i);

  141.                 rsum += r[yi] * rbs;
  142.                 gsum += g[yi] * rbs;
  143.                 bsum += b[yi] * rbs;

  144.                 if (i > 0) {
  145.                     rinsum += sir[0];
  146.                     ginsum += sir[1];
  147.                     binsum += sir[2];
  148.                 } else {
  149.                     routsum += sir[0];
  150.                     goutsum += sir[1];
  151.                     boutsum += sir[2];
  152.                 }

  153.                 if (i < hm) {
  154.                     yp += w;
  155.                 }
  156.             }
  157.             yi = x;
  158.             stackpointer = radius;
  159.             for (y = 0; y < h; y++) {
  160.                 // Preserve alpha channel: ( 0xff000000 & pix[yi] )
  161.                 pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];

  162.                 rsum -= routsum;
  163.                 gsum -= goutsum;
  164.                 bsum -= boutsum;

  165.                 stackstart = stackpointer - radius + div;
  166.                 sir = stack[stackstart % div];

  167.                 routsum -= sir[0];
  168.                 goutsum -= sir[1];
  169.                 boutsum -= sir[2];

  170.                 if (x == 0) {
  171.                     vmin[y] = Math.min(y + r1, hm) * w;
  172.                 }
  173.                 p = x + vmin[y];

  174.                 sir[0] = r[p];
  175.                 sir[1] = g[p];
  176.                 sir[2] = b[p];

  177.                 rinsum += sir[0];
  178.                 ginsum += sir[1];
  179.                 binsum += sir[2];

  180.                 rsum += rinsum;
  181.                 gsum += ginsum;
  182.                 bsum += binsum;

  183.                 stackpointer = (stackpointer + 1) % div;
  184.                 sir = stack[stackpointer];

  185.                 routsum += sir[0];
  186.                 goutsum += sir[1];
  187.                 boutsum += sir[2];

  188.                 rinsum -= sir[0];
  189.                 ginsum -= sir[1];
  190.                 binsum -= sir[2];

  191.                 yi += w;
  192.             }
  193.         }

  194.         bitmap.setPixels(pix, 0, w, 0, 0, w, h);

  195.         return (bitmap);
  196.     }
  197. }
複製代碼
這次上傳代碼比較急,不過代碼後期會優化

發佈了50 篇原創文章 · 獲贊 15 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章