在看了iOS上面的CoverFlow后,感觉效果真的不错,就想在android上面实现一个,这个程序在网上参考了一此核心的代码,当然我添加了一些其他的东西,废话不多说,先看效果,不然就是无图无真相。
Demo下载地址:GalleryFlow
其实实现这个效果很简单,下面作一个简单的介绍
一,创建倒影效果
这个基本思路是:
1,创建一个源图一样的图,利用martrix将图片旋转180度。这个倒影图的高是源图的一半。
- Matrix matrix = new Matrix();
-
-
-
- matrix.preScale(1, -1);
-
- Bitmap reflectionBitmap = Bitmap.createBitmap(
- srcBitmap,
- 0,
- srcBitmap.getHeight() / 2,
- 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上面。
-
- Canvas canvas = new Canvas(bitmapWithReflection);
-
-
- canvas.drawBitmap(srcBitmap, 0, 0, null);
-
-
- 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));
-
-
- canvas.drawRect(
- 0,
- srcHeight,
- srcWidth,
- bitmapWithReflection.getHeight() + REFLECTION_GAP,
- paint);
二,扩展Gallery
扩展系统的gallery,我们需要重写两个方法,getChildStaticTransformation()和getChildDrawingOrder(),同时,要使这两个方法能被调用,必须执行如下两行代码,文档上面是有说明的。
-
- this.setStaticTransformationsEnabled(true);
-
- this.setChildrenDrawingOrderEnabled(true);
- @Override
- protected int getChildDrawingOrder(int childCount, int i)
- {
-
- int selectedIndex = getSelectedItemPosition() - getFirstVisiblePosition();
- if (selectedIndex < 0)
- {
- return i;
- }
-
- if (i < selectedIndex)
- {
- return i;
- }
- else if (i >= selectedIndex)
- {
- return childCount - 1 - i + selectedIndex;
- }
-