乐乐音乐播放器(六) 仿酷狗的左滑菜单

源码下载: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. }
复制代码
这次上传代码比较急,不过代码后期会优化

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redrain仿酷狗音乐播放器     这篇文章只是对开源的说明!关于这个Redrain音乐盒的发布程序的说明和使用方法,见《Redrain仿酷狗音乐播放器开发完毕,发布测试程序》。    今天,我把这个项目的源代码上传。包括了可以编译工程所需的所有代码文件,已经软件的布局文件,但是没有包括软件需要的素材,这也是为了避免引起与酷狗播放器的权问题。        我在这个项目中使用的是 UiLib 库而不是 DuiLib 库,UiLib库是DuiLib库的扩展本,增加了一些动画控件的支持,扩展了部分控件,但是核心代码并没有改变,与DuiLib使用方法完全一样,也可以用UiLib库直接编译使用 DuiLib 库编写的代码。项目中的 UiLib 是我为了适应仿酷狗而专门修改过的,也修复过必要的 bug,所以如果你使用原的 DuiLib 或者 UiLib 库去编译这个功能,最终的程序效果和我发布的不一样。关于 bug的修复请看博客中更早期的文章。我自己使用并且维护的DuiLib库和UiLib库的下载地址见博客:《Redrain个人维护并使用的DuiLib和UiLib库源码下载地址》       在这个项目源码中,同时包含了webkit内核浏览器控件、音乐播放类、换肤功能、拖拽功能、菜单等等。这个菜单的功能如下:         1、可以展现多级菜单         2、可内嵌自定义控件,并且控件可以向主窗体发送消息,如图的红色叹号就是个按钮控件,可以制作酷狗音乐的托盘菜单的播放暂停按钮和进度控制进度条。         3、菜单拥有阴影效果         4、菜单可以自定义前方显示小图标,并且可以控制图标的大小和是否显示         5、菜单可以根据是否拥有子菜单决定是否显示小箭头         6、菜单可以添加分割线         7、每个菜单项都可以单选和复选的功能         8、优化菜单的xml描述文件,编写方便容易,如果要写一个二级菜单,比如编写图片中的菜单测试4以及他的子菜单,只需如下代码就可以了         9、可以通过键盘的按钮控制菜单的选项         10、每个菜单项的高度宽度是任意调整的 在这个项目中,还有一些未实现的功能,但是我并不打算继续完成这些功能了:      1、退出程序时逐渐缩小的动画特效      2、各个菜单的响应      3、歌词功能(已经有网友做出来了,我就不另外做了)      4、嵌入桌面的桌面歌词 注意 此项目开源代码只是为了学习交流,不可用于商业程序,源码对使用者造成的损失,概不负责! 源码下载地址:点击打开链接 via http://blog.csdn.net/zhuhongshu/article/details/41037875
2009.08.05乐乐播放器3.0 增加搜索功能,flash键盘钢琴,播放本地flash动画。 练习flash键盘钢琴时,如果按键没有声音,请在flash键盘钢琴用鼠标点一下再按键盘即可。 注意:3.0已经修正为全屏状态下按“F1”键返回主窗口。 2009.07.26乐乐儿童播放器2.0增加全屏播放、我的收藏功能,去除冗余代码。 下载后直接全部覆盖以前的文件即可升级成功。 软件名称:乐乐儿童播放器 软件平台:win9x winnt win2000 winxp winvista win2003 软件授权:免费软件 软件大小:3.4M 软件语言:简体中文 软件网址:http://www.yule2009.com/ 软件介绍: 乐乐儿童播放器收录了1000多首儿歌、500多个儿童故事,2000多个儿童游戏,以及涉及拼音、汉字笔画、成语、绕口令、三字经、弟子规、手工制作、语文课件、数学课件、物理课件、动物科学、植物科学、生物科学、幼儿教育等4000多个学知识的FLASH,还有1000个学英语的FLASH,700多首古诗朗诵,300多个看图识字,所有动画都有专业人员的录音,文字颜色随录音的播放而变色。所有文字加有拼音,并能区分多音字。特色功能还有2000多个动画识字,可以按照笔画顺序写出汉字。对您孩子的早期教育一定会有非常大的帮助,让您的孩子赢在起跑线上。乐乐儿童播放器并且是款免费绿色软件,无任何插件,解压即可运行。 使用说明: 解压到任何目录运行乐乐儿童播放器.exe即可,由于软件部分功能需要联网操作,可能被防火墙所阻隔,所以在防火墙设置里放行就可以。 点击最左侧的菜单即可载入相应的flash,比如点击听儿歌,就可以载入全部儿歌的flash,然后双击儿歌的名称即可自动下载播放。 对于第一次播放需要联网下载,以后则无需下载直接播放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值