先上一张效果图:
的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.setTransformationType(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这个函数,所以我们只需要在这个函数里面去加上旋转和放大的操作就可以了其他的getter和setter函数都可以无视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); |
106 |
107 |
返回 ImageView的; |
108 |
} |
109 |
|
110 |
} |
BitmapDrawable绘制=(BitmapDrawable) i.getDrawable();
drawable.setAntiAlias(true);
是保证图片绕Y旋转了以后不会出现锯齿. 下面是Activity:
01 |
包 com.coverflow; |
02 |
03 |
进口 android.app.Activity; |
04 |
进口 android.graphics.Color; |
05 |
进口 android.os.Bundle; |
06 |
07 |
进口 com.gallery.R; |
08 |
09 |
公共 类 HelloAndroid 延伸 活动{ |
10 |
/ **调用首次创建活动时。* / |
11 |
@覆盖 |
12 |
公共 无效 的onCreate(捆绑savedInstanceState){ |
13 |
超强 。的onCreate(savedInstanceState); |
14 |
15 |
的CoverFlow CF = 新 的CoverFlow( 本 ); |
16 |
/ / cf.setBackgroundResource(R.drawable.shape); |
17 |
cf.setBackgroundColor(Color.black的); |
18 |
cf.setAdapter( 新 ImageAdapter( 这 )); |
19 |
ImageAdapter imageAdapter = 新 ImageAdapter( 本 ); |
20 |
cf.setAdapter(imageAdapter); |
21 |
/ / cf.setAlphaMode(假); |
22 |
/ / cf.setCircleMode(假); |
23 |
cf.setSelection( 2 , 真 ); |
24 |
cf.setAnimationDuration( 1000 ); |
25 |
的setContentView(CF); |
26 |
} |
27 |
28 |
} |
参考自:
http://www.eoeandroid.com/thread-70209-1-1.html
http://www.apkbus.com/android-18441-1-1.html