源碼下載:http://www.eoeandroid.com/thread-588446-1-1.html
該功能主要是使用開源的SlidingMenu來實現的,其中盜用了這篇文章的大部分代碼,http://blog.csdn.net/xinayida/article/details/40614835
不過他是右滑動的,我修改了一下,弄了一個左滑動的,併爲背景圖片添加了 模糊 效果
修改代碼如下:
-
package com.happy.ui;
-
-
import java.io.InputStream;
-
-
import android.app.Activity;
-
import android.graphics.Bitmap;
-
import android.graphics.BitmapFactory;
-
import android.graphics.Canvas;
-
import android.graphics.drawable.BitmapDrawable;
-
import android.graphics.drawable.Drawable;
-
import android.os.AsyncTask;
-
import android.os.Bundle;
-
-
import com.happy.logger.LoggerManage;
-
import com.happy.slidingmenu.SlidingMenu;
-
import com.happy.slidingmenu.SlidingMenu.CanvasTransformer;
-
import com.happy.util.FastBlur;
-
import com.happy.util.ImageUtil;
-
-
public class MainActivity extends Activity {
-
-
private LoggerManage logger;
-
-
private SlidingMenu slidingMenu;
-
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
init();
-
}
-
-
private void init() {
-
logger = LoggerManage.getZhangLogger(this);
-
-
slidingMenu = (SlidingMenu) findViewById(R.id.slidingMenu);
-
-
slidingMenu.setMode(SlidingMenu.RIGHT);// 設置滑動的方向 向左 、向右或向左向右
-
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//
-
// 設置從哪裏可以觸發滑動效果:全屏、邊界、不可以
-
slidingMenu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);
-
-
slidingMenu.setContent(R.layout.slidmenu_mainview);
-
slidingMenu.setMenu(R.layout.slidmenu_menu);
-
-
slidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
-
-
slidingMenu.setFadeDegree(0f);// menu的漸隱效果係數(0-1)
-
slidingMenu.setBehindScrollScale(0f);// 主頁面移動1個像素,menu移動0.1個像素
-
slidingMenu.setAboveCanvasTransformer(new CanvasTransformer() {
-
-
@Override
-
public void transformCanvas(Canvas canvas, float percentOpen) {
-
// percentOpen從0變到1,原圖從1倍大小縮小到3/4
-
float scale = (float) (1.0 - 0.25 * percentOpen);
-
// x,y方向同時放大,動畫的相對中心定在“右中”
-
canvas.scale(scale, scale, canvas.getWidth(),
-
canvas.getHeight() / 2);
-
}
-
});
-
-
slidingMenu.setBehindCanvasTransformer(new CanvasTransformer() {
-
-
@Override
-
public void transformCanvas(Canvas canvas, float percentOpen) {
-
// // 原圖從3/4增加到1倍大小
-
// float scale = (float) (0.75 + 0.25 * percentOpen);
-
// // x座標先向屏幕右邊移動3/4的視圖寬度,然後再慢慢移動到0,這樣來實現從屏幕右邊移動進屏幕的效果
-
// canvas.translate(3 * canvas.getWidth() / 4 - 3 * percentOpen
-
// * canvas.getWidth() / 4, 0);
-
// // x,y方向同時縮小,動畫的相對中心定在“左中”,這樣就不至於縮放的時候屏幕左邊出現一條空白。
-
// canvas.scale(scale, scale, 0, canvas.getHeight() / 2);
-
-
float scale = (float) (percentOpen * 0.25 + 0.75);
-
canvas.scale(scale, scale, canvas.getWidth(),
-
canvas.getHeight() / 2);
-
-
}
-
});
-
-
BitmapFactory.Options opt = new BitmapFactory.Options();
-
opt.inPreferredConfig = Bitmap.Config.RGB_565;// 表示16位位圖
-
// 565代表對應三原色佔的位數
-
opt.inInputShareable = true;
-
opt.inPurgeable = true;// 設置圖片可以被回收
-
InputStream is = getResources().openRawResource(
-
R.drawable.bg_skin_thumb3);
-
Bitmap bmp = BitmapFactory.decodeStream(is, null, opt);
-
//將 immutable bitmap 轉爲 mutable bitmap 防止報 java.lang.IllegalStateException at android.graphics.Bitmap.setPixels(Bitmap.java:1461)
-
//具體可以參考 http://www.educity.cn/wenda/155359.html
-
-
Bitmap bmp2 = Bitmap.createScaledBitmap(bmp, 480, 320,false);
-
// Drawable drawable = ImageUtil.boxBlurFilter(bmp);
-
// new AsyncTask<String, Integer, String>() {
-
//
-
// @Override
-
// protected String doInBackground(String... params) {
-
// final Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
-
// R.drawable.bg_skin_thumb3);
-
//添加圖片模糊
-
Bitmap drawable = FastBlur.doBlur(bmp2, 20, true);
-
slidingMenu.setBackground(new BitmapDrawable(drawable));
-
// return null;
-
// }
-
// }.execute("");
-
-
}
-
-
}
-
package com.happy.util;
-
-
import android.graphics.Bitmap;
-
-
/**
-
* Created by paveld on 3/6/14.
-
*/
-
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
-
// http://incubator.quasimondo.com
-
// created Feburary 29, 2004
-
// Android port : Yahel Bouaziz
-
// 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
-
-
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);
-
}
- }