Android实现CoverFlow效果

先上一张效果图: 

上代码,看了代码什么都明白 

的CoverFlow从画廊继承过来

001  com.coverflow;
002  
003 进口 android.content.Context;
004 进口 android.graphics.Camera;
005 进口 android.graphics.Matrix;
006 进口 android.util.AttributeSet;
007 进口 android.view.View;
008 进口 android.view.animation.Transformation;
009 进口 android.widget.Gallery;
010 进口 android.widget.ImageView;
011  
012 公共  的CoverFlow  扩展 库{
013  
014     私人 相机mCamera =  新的 摄像头();
015     私人 诠释 mMaxRotationAngle =  50 ;
016     私人 诠释 mMaxZoom = - 380 ;
017     私人 诠释 mCoveflowCenter;
018     私人 布尔 mAlphaMode =  ;
019     私人 布尔 mCircleMode =  虚假的;
020  
021     公众 的CoverFlow(上下文上下文){
022         (上下文);
023         setStaticTransformationsEnabled();
024     }
025  
026     公众 的CoverFlow(上下文背景下,的AttributeSet attrs)在{
027         (上下文,ATTRS);
028         setStaticTransformationsEnabled();
029     }
030  
031     公众 的CoverFlow(上下文背景下,的AttributeSet attrs,这个  整数 defStyle){
032         (上下文,ATTRS,defStyle);
033         setStaticTransformationsEnabled();
034     }
035  
036     公众 诠释 getMaxRotationAngle(){
037         返回 mMaxRotationAngle;
038     }
039  
040     公共 无效 setMaxRotationAngle(INT  maxRotationAngle){
041         mMaxRotationAngle = maxRotationAngle;
042     }
043  
044     公共 布尔 getCircleMode(){
045         返回 mCircleMode;
046     }
047  
048     公共 无效 setCircleMode(布尔 isCircle){
049         mCircleMode = isCircle;
050     }
051  
052     公共 布尔 getAlphaMode(){
053         返回 mAlphaMode;
054     }
055  
056     公共 无效 setAlphaMode(布尔 是字母){
057         mAlphaMode =是字母;
058     }
059  
060     公众 诠释 getMaxZoom(){
061         返回 mMaxZoom;
062     }
063  
064     公共 无效 setMaxZoom(整型 的maxZoom){
065         mMaxZoom =的maxZoom;
066     }
067  
068     私人 诠释 getCenterOfCoverflow(){
069         返回 (的getWidth() - getPaddingLeft() - getPaddingRight())/  2
070                 + getPaddingLeft();
071     }
072  
073     私有 静态 诠释 getCenterOfView(View视图){
074         返回 view.getLeft()+ view.getWidth()/  2 ;
075     }
076  
077     保护 布尔 getChildStaticTransformation(查看孩子,变换T){
078         最终的 诠释 childCenter = getCenterOfView(孩子);
079         最终的 诠释 childWidth = child.getWidth();
080         整型 rotationAngle =  0 ;
081         t.clear();
082         t.se​​tTransformationType(Transformation.TYPE_MATRIX);
083         如果 (childCenter == mCoveflowCenter){
084             transformImageBitmap((ImageView的)孩子,T,  0 );
085         其他 {
086             rotationAngle =(整数)(((浮动)(mCoveflowCenter - childCenter)/ childWidth)* mMaxRotationAngle);
087             如果 (Math.abs(rotationAngle)> mMaxRotationAngle){
088                 rotationAngle =(rotationAngle <  0 )?- mMaxRotationAngle
089                         :mMaxRotationAngle;
090             }
091             transformImageBitmap((ImageView的)孩子,叔,rotationAngle);
092         }
093         返回 ;
094     }
095  
096     / **
097      *这就是所谓的在大小的布局时,这一观点已经发生了改变。如果你只是添加到视图层次,有人叫你旧的观念价值观为0。
098      *
099      * @参数瓦特
100      *这种观点的当前宽度。
101      * @参数ħ
102      *这种观点的当前高度。
103      * @参数oldw
104      *这种观点的旧宽度。
105      * @参数oldh
106      *这种观点的旧的高度。
107      * /
108     保护 无效 onSizeChanged(整数 W,  整型 小时,  整型 oldw,  整型 oldh){
109         mCoveflowCenter = getCenterOfCoverflow();
110         超强。onSizeChanged(W,H,oldw,oldh);
111     }
112  
113     / **
114      *把图像位图的角度通过
115      *
116      * @参数的ImageView
117      * ImageView的,我们要旋转的位图的ImageView
118      * @参数吨
119      *转型
120      * @参数rotationAngle
121      *角度由旋转的位图
122      * /
123     私人 无效 transformImageBitmap(ImageView的孩子,变换T,
124             整型 rotationAngle){
125         mCamera.save();
126         最终 矩阵imageMatrix = t.getMatrix();
127         最终的 诠释 。imageHeight = child.getLayoutParams()的高度;
128         最终的 诠释 imageWidth = child.getLayoutParams()宽;
129         最终的 诠释 旋转= Math.abs(rotationAngle);
130         mCamera.translate(0 .0楼  0 .0楼  100 .0 f)条;
131  
132         / /如视图的角度更少,放大
133         如果 (旋转<= mMaxRotationAngle){
134             浮动 zoomAmount =(浮动)(mMaxZoom +(旋转*  1.5 ));
135             mCamera.translate(0 .0楼  0 .0楼zoomAmount);
136             如果 (mCircleMode){
137                 如果 (旋转<  40
138                     mCamera.translate(0 .0楼  155 ,  0 .0 f)条;
139                 其他
140                     mCamera.translate(0 .0楼(255  -旋转*  2 .5 F),  0 .0 f)条;
141             }
142             如果 (mAlphaMode){
143                 ((ImageView的)(子))setAlpha((整数)(255  -旋转*  2.5 ));
144             }
145         }
146         mCamera.rotateY(rotationAngle);
147         mCamera.getMatrix(imageMatrix);
148         imageMatrix.preTranslate( - (imageWidth /  2 ), - (imageHeight /  2 ));
149         imageMatrix.postTranslate((imageWidth /  2 ),(imageHeight /  2 ));
150         mCamera.restore();
151     }
152 }

这个就是的CoverFlow类,说明几点:
1。成员函数mCamera是用来做类3D效果处理,比如z轴方向上的平移,绕y轴的旋转等mMaxRotationAngle是图片绕y轴最大旋转角度,也就是屏幕最边上那两张图片的旋转角度mMaxZoom是图片在z轴平移的距离,视觉上看起来就是放大缩小的效果. 其他的变量都可以无视也就是说把这个属性设成true的时候每次viewGroup (看Gallery的源码就可以看到它是从ViewGroup间接继承过来的)在重新画它的child的时候都会促发getChildStaticTransformation这个函数,所以我们只需要在这个函数里面去加上旋转和放大的操作就可以了其他的gettersetter函数都可以无视ImageAdapter适配器:







001  com.coverflow;
002  
003 进口 android.content.Context;
004 进口 android.graphics.Bitmap;
005 进口 android.graphics.BitmapFactory;
006 进口 android.graphics.Canvas;
007 进口 android.graphics.LinearGradient;
008 进口 android.graphics.Matrix;
009 进口 android.graphics.Paint;
010 进口 android.graphics.PorterDuffXfermode;
011 进口 android.graphics.Bitmap.Config;
012 进口 android.graphics.PorterDuff.Mode;
013 进口 android.graphics.Shader.TileMode;
014 进口 android.graphics.drawable.BitmapDrawable;
015 进口 android.view.View;
016 进口 android.view.ViewGroup;
017 进口 android.widget.BaseAdapter;
018 进口 android.widget.ImageView;
019  
020 进口 com.gallery.R;
021  
022 公共  ImageAdapter  扩展 BaseAdapter {
023     整型 mGalleryItemBackground;
024     私人 上下文mContext;
025     私人 整数[] mImageIds = {
026             R.drawable.a1,
027             R.drawable.a2,
028             R.drawable.a3,
029             R.drawable.a4,
030             R.drawable.a5};
031  
032     公共 ImageAdapter(上下文C){
033         mContext = C;
034     }
035  
036     公众 整数 个GetCount(){
037         返回 mImageIds.length;
038     }
039  
040     公共 对象的getItem(整数 位){
041         返回 的位置;
042     }
043  
044     公共  getItemId(整数 位){
045         返回 的位置;
046     }
047  
048     公共 查看getView(整数 位置,查看convertView,视图组父){
049  
050         ImageView的我= createReflectedImages(mContext,mImageIds [位置]);
051          
052         i.setLayoutParams( CoverFlow.LayoutParams(120 ,  100 ));
053         i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
054          
055         / /设置的抗锯齿
056         BitmapDrawable提拉=(BitmapDrawable)i.getDrawable();
057         drawable.setAntiAlias();
058         返回 我;
059     }
060  
061     公众 持股量 getScale(布尔 重点,  INT  偏移){
062         返回 Math.max(0 ,  1 ​​.0 F /(浮动)Math.pow(2 ,Math.abs(偏移)));
063     }
064      
065     公共 ImageView的createReflectedImages(上下文mContext,诠释 imageId){
066  
067         位图originalImage = BitmapFactory.decodeResource(mContext.getResources(),imageId);
068          
069         最终的 诠释 reflectionGap =  4 ;
070          
071         诠释 宽度= originalImage.getWidth();
072         整型 高度= originalImage.getHeight();
073  
074         矩阵的矩阵=  新的 矩阵();
075         matrix.preScale(1 , - 1 );
076  
077         位图reflectionImage = Bitmap.createBitmap(originalImage,  0
078                 高度/  2 ,宽度,高度/  2 ,矩阵,  );
079  
080         位图bitmapWithReflection = Bitmap.createBitmap(宽度,
081                 (高+高/  2 ),Config.ARGB_8888);
082  
083         帆布帆布=  新的 画布(bitmapWithReflection);
084  
085         canvas.drawBitmap(originalImage,  0 ,  0 ,  );
086  
087         涂料deafaultPaint =   的paint();
088         canvas.drawRect(0 ,高度,宽度,高度+ reflectionGap,deafaultPaint);
089  
090         canvas.drawBitmap(reflectionImage,  0 ,高度+ reflectionGap,  );
091  
092         涂料粉刷=   的paint();
093         的LinearGradient着色器=   的LinearGradient(0 ,originalImage
094                 。getHeight()都会,  0 ,bitmapWithReflection.getHeight()
095                 + reflectionGap,  0x70ffffff ,  到0x00FFFFFF ,TileMode.MIRROR);
096  
097         paint.setShader(着色器);
098  
099         paint.setXfermode( PorterDuffXfermode(Mode.DST_IN));
100  
101         canvas.drawRect(0 ,高度,宽度,bitmapWithReflection.getHeight()
102                 + reflectionGap,油漆);
103  
104         ImageView的ImageView的=   ImageView的(mContext);
105         imageView.setImageBitmap(bitmapWithReflection);