在看了iOS上面的CoverFlow後,感覺效果真的不錯,就想在Android上面實現一個,這個程序在網上參考了一此核心的代碼,當然我添加了一些其他的東西,廢話不多說,先看效果,不然就是無圖無真相。
Demo下載:GalleryFlow
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2013年資料/4月/22日/Android Gallery 3D效果
其實實現這個效果很簡單,下面作一個簡單的介紹
一,創建倒影效果
這個基本思路是:
1,創建一個源圖一樣的圖,利用martrix將圖片旋轉180度。這個倒影圖的高是源圖的一半。
Matrix matrix = new Matrix();
// 1表示放大比例,不放大也不縮小。
// -1表示在y軸上相反,即旋轉180度。
matrix.preScale(1, -1);
Bitmap reflectionBitmap = Bitmap.createBitmap(
srcBitmap,
0,
srcBitmap.getHeight() / 2, // top為源圖的一半
srcBitmap.getWidth(), // 寬度與源圖一樣
srcBitmap.getHeight() / 2, // 高度與源圖的一半
matrix,
false);
2,創建一個最終效果的圖,即源圖 + 間隙 + 倒影。
final int REFLECTION_GAP = 5;
Bitmap bitmapWithReflection = Bitmap.createBitmap(
reflectionWidth,
srcHeight + reflectionHeight + REFLECTION_GAP,
Config.ARGB_8888);
3,依次將源圖、倒影圖繪制在最終的bitmap上面。
// Prepare the canvas to draw stuff.
Canvas canvas = new Canvas(bitmapWithReflection);
// Draw the original bitmap.
canvas.drawBitmap(srcBitmap, 0, 0, null);
// Draw the reflection bitmap.
canvas.drawBitmap(reflectionBitmap, 0, srcHeight + REFLECTION_GAP, null);
4,創建LinearGradient,從而給定一個由上到下的漸變色。
Paint paint = new Paint();
paint.setAntiAlias(true);
LinearGradient shader = new LinearGradient(
0,
srcHeight,
0,
bitmapWithReflection.getHeight() + REFLECTION_GAP,
0x70FFFFFF,
0x00FFFFFF,
TileMode.MIRROR);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN));
// Draw the linear shader.
canvas.drawRect(
0,
srcHeight,
srcWidth,
bitmapWithReflection.getHeight() + REFLECTION_GAP,
paint);