android 重叠gallery 3D效果实现

本文介绍了如何在Android上实现类似iOS CoverFlow的3D效果,包括创建倒影效果和扩展Gallery组件。通过重写Gallery的getChildStaticTransformation和getChildDrawingOrder方法,以及使用Camera和Matrix实现图片的旋转和缩放效果。
摘要由CSDN通过智能技术生成

 在看了iOS上面的CoverFlow后,感觉效果真的不错,就想在android上面实现一个,这个程序在网上参考了一此核心的代码,当然我添加了一些其他的东西,废话不多说,先看效果,不然就是无图无真相。

Demo下载地址:GalleryFlow



其实实现这个效果很简单,下面作一个简单的介绍


一,创建倒影效果

这个基本思路是:

1,创建一个源图一样的图,利用martrix将图片旋转180度。这个倒影图的高是源图的一半。

[java]  view plain   copy
  1. Matrix matrix = new Matrix();  
  2.   
  3. // 1表示放大比例,不放大也不缩小。  
  4. // -1表示在y轴上相反,即旋转180度。  
  5. matrix.preScale(1, -1);  
  6.   
  7. Bitmap reflectionBitmap = Bitmap.createBitmap(  
  8.     srcBitmap,  
  9.     0,   
  10.     srcBitmap.getHeight() / 2,  // top为源图的一半  
  11.     srcBitmap.getWidth(),       // 宽度与源图一样  
  12.     srcBitmap.getHeight() / 2,  // 高度与源图的一半  
  13.     matrix,  
  14.     false);  

2,创建一个最终效果的图,即源图 + 间隙 + 倒影。

[java]  view plain   copy
  1. final int REFLECTION_GAP = 5;  
  2.   
  3. Bitmap bitmapWithReflection = Bitmap.createBitmap(  
  4.        reflectionWidth,  
  5.        srcHeight + reflectionHeight + REFLECTION_GAP,   
  6.        Config.ARGB_8888);  

3,依次将源图、倒影图绘制在最终的bitmap上面。

[java]  view plain   copy
  1. // Prepare the canvas to draw stuff.  
  2. Canvas canvas = new Canvas(bitmapWithReflection);  
  3.               
  4. // Draw the original bitmap.  
  5. canvas.drawBitmap(srcBitmap, 00null);  
  6.               
  7. // Draw the reflection bitmap.  
  8. canvas.drawBitmap(reflectionBitmap, 0, srcHeight + REFLECTION_GAP, null);  
4,创建LinearGradient,从而给定一个由上到下的渐变色。

[java]  view plain   copy
  1. Paint paint = new Paint();  
  2. paint.setAntiAlias(true);  
  3. LinearGradient shader = new LinearGradient(  
  4.         0,   
  5.         srcHeight,   
  6.         0,   
  7.         bitmapWithReflection.getHeight() + REFLECTION_GAP,   
  8.         0x70FFFFFF,   
  9.         0x00FFFFFF,  
  10.         TileMode.MIRROR);  
  11. paint.setShader(shader);  
  12. paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN));  
  13.   
  14. // Draw the linear shader.  
  15. canvas.drawRect(  
  16.         0,   
  17.         srcHeight,   
  18.         srcWidth,   
  19.         bitmapWithReflection.getHeight() + REFLECTION_GAP,   
  20.         paint);  

二,扩展Gallery

扩展系统的gallery,我们需要重写两个方法,getChildStaticTransformation()和getChildDrawingOrder(),同时,要使这两个方法能被调用,必须执行如下两行代码,文档上面是有说明的。

[java]  view plain   copy
  1. // Enable set transformation.  
  2. this.setStaticTransformationsEnabled(true);  
  3. // Enable set the children drawing order.  
  4. this.setChildrenDrawingOrderEnabled(true);  

  • getChildDrawingOrder的实现

[java]  view plain   copy
  1. @Override  
  2. protected int getChildDrawingOrder(int childCount, int i)  
  3. {  
  4.     // Current selected index.  
  5.     int selectedIndex = getSelectedItemPosition() - getFirstVisiblePosition();  
  6.     if (selectedIndex < 0)   
  7.     {  
  8.         return i;  
  9.     }  
  10.       
  11.     if (i < selectedIndex)  
  12.     {  
  13.         return i;  
  14.     }  
  15.     else if (i >= selectedIndex)  
  16.     {  
  17.         return childCount - 1 - i + selectedIndex;  
  18.     }  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 Android 头像重叠效果的方法有很多种,下面介绍其中一种比较简单的方法: 1. 首先,将多个头像图片放入一个 LinearLayout 中,并设置 LinearLayout 的方向为水平方向。 2. 然后,给每个头像图片添加一个 margin 值,使得它们之间有重叠效果。可以通过在 XML 中设置 layout_margin 属性或者在 Java 代码中设置 MarginLayoutParams 来实现。 3. 最后,为每个头像图片添加一个阴影效果,使得它们看起来更加立体。可以通过在 XML 中设置 android:elevation 属性或者在 Java 代码中调用 View.setElevation() 方法来实现。 具体实现细节可以参考下面的代码示例: ``` <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/avatar1" android:layout_marginLeft="-50dp" android:elevation="4dp"/> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/avatar2" android:layout_marginLeft="-40dp" android:elevation="4dp"/> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/avatar3" android:layout_marginLeft="-30dp" android:elevation="4dp"/> </LinearLayout> ``` 上面的代码实现了三个头像图片重叠效果,并为每个头像图片添加了阴影效果。你可以根据自己的需求调整头像图片的数量、大小、重叠程度和阴影效果等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值