先上一张效果图:
上代码,看了代码什么都明白
的CoverFlow从画廊继承过来
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; |
012 | 公共 类 的CoverFlow 扩展 库{ |
014 | 私人 相机mCamera = 新的 摄像头(); |
015 | 私人 诠释 mMaxRotationAngle = 50 ; |
016 | 私人 诠释 mMaxZoom = - 380 ; |
017 | 私人 诠释 mCoveflowCenter; |
018 | 私人 布尔 mAlphaMode = 真 ; |
019 | 私人 布尔 mCircleMode = 虚假的 ; |
021 | 公众 的CoverFlow(上下文上下文){ |
023 | 这 setStaticTransformationsEnabled( 真 ); |
026 | 公众 的CoverFlow(上下文背景下,的AttributeSet attrs)在{ |
028 | 这 setStaticTransformationsEnabled( 真 ); |
031 | 公众 的CoverFlow(上下文背景下,的AttributeSet attrs,这个 整数 defStyle){ |
032 | 超 (上下文,ATTRS,defStyle); |
033 | 这 setStaticTransformationsEnabled( 真 ); |
036 | 公众 诠释 getMaxRotationAngle(){ |
037 | 返回 mMaxRotationAngle; |
040 | 公共 无效 setMaxRotationAngle( INT maxRotationAngle){ |
041 | mMaxRotationAngle = maxRotationAngle; |
044 | 公共 布尔 getCircleMode(){ |
048 | 公共 无效 setCircleMode( 布尔 isCircle){ |
049 | mCircleMode = isCircle; |
052 | 公共 布尔 getAlphaMode(){ |
056 | 公共 无效 setAlphaMode( 布尔 是字母){ |
064 | 公共 无效 setMaxZoom( 整型 的maxZoom){ |
068 | 私人 诠释 getCenterOfCoverflow(){ |
069 | 返回 (的getWidth() - getPaddingLeft() - getPaddingRight())/ 2 |
073 | 私有 静态 诠释 getCenterOfView(View视图){ |
074 | 返回 view.getLeft()+ view.getWidth()/ 2 ; |
077 | 保护 布尔 getChildStaticTransformation(查看孩子,变换T){ |
078 | 最终的 诠释 childCenter = getCenterOfView(孩子); |
079 | 最终的 诠释 childWidth = child.getWidth(); |
080 | 整型 rotationAngle = 0 ; |
082 | t.setTransformationType(Transformation.TYPE_MATRIX); |
083 | 如果 (childCenter == mCoveflowCenter){ |
084 | transformImageBitmap((ImageView的)孩子,T, 0 ); |
086 | rotationAngle =( 整数 )((( 浮动 )(mCoveflowCenter - childCenter)/ childWidth)* mMaxRotationAngle); |
087 | 如果 (Math.abs(rotationAngle)> mMaxRotationAngle){ |
088 | rotationAngle =(rotationAngle < 0 )?- mMaxRotationAngle |
091 | transformImageBitmap((ImageView的)孩子,叔,rotationAngle); |
097 | *这就是所谓的在大小的布局时,这一观点已经发生了改变。如果你只是添加到视图层次,有人叫你旧的观念价值观为0。 |
108 | 保护 无效 onSizeChanged( 整数 W, 整型 小时, 整型 oldw, 整型 oldh){ |
109 | mCoveflowCenter = getCenterOfCoverflow(); |
110 | 超强 。onSizeChanged(W,H,oldw,oldh); |
117 | * ImageView的,我们要旋转的位图的ImageView |
123 | 私人 无效 transformImageBitmap(ImageView的孩子,变换T, |
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)条; |
133 | 如果 (旋转<= mMaxRotationAngle){ |
134 | 浮动 zoomAmount =( 浮动 )(mMaxZoom +(旋转* 1.5 )); |
135 | mCamera.translate( 0 .0楼 0 .0楼zoomAmount); |
138 | mCamera.translate( 0 .0楼 155 , 0 .0 f)条; |
140 | mCamera.translate( 0 .0楼( 255 -旋转* 2 .5 F), 0 .0 f)条; |
143 | ((ImageView的)(子))setAlpha(( 整数 )( 255 -旋转* 2.5 )); |
146 | mCamera.rotateY(rotationAngle); |
147 | mCamera.getMatrix(imageMatrix); |
148 | imageMatrix.preTranslate( - (imageWidth / 2 ), - (imageHeight / 2 )); |
149 | imageMatrix.postTranslate((imageWidth / 2 ),(imageHeight / 2 )); |
这个就是的CoverFlow类,说明几点:
1。成员函数mCamera是用来做类3D效果处理,比如z轴方向上的平移,绕y轴的旋转等mMaxRotationAngle是图片绕y轴最大旋转角度,也就是屏幕最边上那两张图片的旋转角度mMaxZoom是图片在z轴平移的距离,视觉上看起来就是放大缩小的效果. 其他的变量都可以无视也就是说把这个属性设成true的时候每次viewGroup (看Gallery的源码就可以看到它是从ViewGroup间接继承过来的)在重新画它的child的时候都会促发getChildStaticTransformation这个函数,所以我们只需要在这个函数里面去加上旋转和放大的操作就可以了其他的getter和setter函数都可以无视ImageAdapter适配器:
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; |
022 | 公共 类 ImageAdapter 扩展 BaseAdapter { |
023 | 整型 mGalleryItemBackground; |
025 | 私人 整数[] mImageIds = { |
032 | 公共 ImageAdapter(上下文C){ |
044 | 公共 长 getItemId( 整数 位){ |
048 | 公共 查看getView( 整数 位置,查看convertView,视图组父){ |
050 | ImageView的我= createReflectedImages(mContext,mImageIds [位置]); |
052 | i.setLayoutParams( 新 CoverFlow.LayoutParams( 120 , 100 )); |
053 | i.setScaleType(ImageView.ScaleType.CENTER_INSIDE); |
056 | BitmapDrawable提拉=(BitmapDrawable)i.getDrawable(); |
057 | drawable.setAntiAlias( 真 ); |
061 | 公众 持股量 getScale( 布尔 重点, INT 偏移){ |
062 | 返回 Math.max( 0 , 1 .0 F /( 浮动 )Math.pow( 2 ,Math.abs(偏移))); |
065 | 公共 ImageView的createReflectedImages(上下文mContext, 诠释 imageId){ |
067 | 位图originalImage = BitmapFactory.decodeResource(mContext.getResources(),imageId); |
069 | 最终的 诠释 reflectionGap = 4 ; |
071 | 诠释 宽度= originalImage.getWidth(); |
072 | 整型 高度= originalImage.getHeight(); |
075 | matrix.preScale( 1 , - 1 ); |
077 | 位图reflectionImage = Bitmap.createBitmap(originalImage, 0 , |
078 | 高度/ 2 ,宽度,高度/ 2 ,矩阵, 假 ); |
080 | 位图bitmapWithReflection = Bitmap.createBitmap(宽度, |
081 | (高+高/ 2 ),Config.ARGB_8888); |
083 | 帆布帆布= 新的 画布(bitmapWithReflection); |
085 | canvas.drawBitmap(originalImage, 0 , 0 , 空 ); |
087 | 涂料deafaultPaint = 新 的paint(); |
088 | canvas.drawRect( 0 ,高度,宽度,高度+ reflectionGap,deafaultPaint); |
090 | canvas.drawBitmap(reflectionImage, 0 ,高度+ reflectionGap, 空 ); |
093 | 的LinearGradient着色器= 新 的LinearGradient( 0 ,originalImage |
094 | 。getHeight()都会, 0 ,bitmapWithReflection.getHeight() |
095 | + reflectionGap, 0x70ffffff , 到0x00FFFFFF ,TileMode.MIRROR); |
097 | paint.setShader(着色器); |
099 | paint.setXfermode( 新 PorterDuffXfermode(Mode.DST_IN)); |
101 | canvas.drawRect( 0 ,高度,宽度,bitmapWithReflection.getHeight() |
104 | ImageView的ImageView的= 新 ImageView的(mContext); |
105 | imageView.setImageBitmap(bitmapWithReflection); |
BitmapDrawable绘制=(BitmapDrawable) i.getDrawable();
drawable.setAntiAlias(true);
是保证图片绕Y旋转了以后不会出现锯齿. 下面是Activity:
03 | 进口 android.app.Activity; |
04 | 进口 android.graphics.Color; |
09 | 公共 类 HelloAndroid 延伸 活动{ |
12 | 公共 无效 的onCreate(捆绑savedInstanceState){ |
13 | 超强 。的onCreate(savedInstanceState); |
15 | 的CoverFlow CF = 新 的CoverFlow( 本 ); |
17 | cf.setBackgroundColor(Color.black的); |
18 | cf.setAdapter( 新 ImageAdapter( 这 )); |
19 | ImageAdapter imageAdapter = 新 ImageAdapter( 本 ); |
20 | cf.setAdapter(imageAdapter); |
23 | cf.setSelection( 2 , 真 ); |
24 | cf.setAnimationDuration( 1000 ); |
参考自:
http://www.eoeandroid.com/thread-70209-1-1.html
http://www.apkbus.com/android-18441-1-1.html