Android控件开发之Gallery3D效果


Android控件开发之Gallery3D效果


  1. package  xiaosi.GalleryFlow;  
  2.   
  3. import  android.app.Activity;  
  4. import  android.os.Bundle;  
  5.   
  6. public   class  GalleryFlowActivity  extends  Activity {  
  7.     public   void  onCreate(Bundle savedInstanceState) {  
  8.         super .onCreate(savedInstanceState);  
  9.           
  10.           
  11.         setContentView(R.layout.main);  
  12.           
  13.         Integer[] images = { R.drawable.a, R.drawable.b,  
  14.                 R.drawable.c, R.drawable.d, R.drawable.e,  
  15.                 };  
  16.           
  17.         ImageAdapter adapter = new  ImageAdapter( this , images);  
  18.         adapter.createReflectedImages();  
  19.   
  20.         GalleryFlow galleryFlow = (GalleryFlow) findViewById(R.id.Gallery01);  
  21.         galleryFlow.setAdapter(adapter);  
  22.           
  23. }  
  24. }  


ImageAdapter.java


  1. package  xiaosi.GalleryFlow;  
  2.   
  3. import  android.content.Context;  
  4. import  android.content.res.Resources;  
  5. import  android.graphics.Bitmap;  
  6. import  android.graphics.BitmapFactory;  
  7. import  android.graphics.Canvas;  
  8. import  android.graphics.LinearGradient;  
  9. import  android.graphics.Matrix;  
  10. import  android.graphics.Paint;  
  11. import  android.graphics.PorterDuffXfermode;  
  12. import  android.graphics.Bitmap.Config;  
  13. import  android.graphics.PorterDuff.Mode;  
  14. import  android.graphics.Shader.TileMode;  
  15. import  android.view.View;  
  16. import  android.view.ViewGroup;  
  17. import  android.widget.BaseAdapter;  
  18. import  android.widget.ImageView;  
  19. import  android.widget.ImageView.ScaleType;  
  20.   
  21. public   class  ImageAdapter  extends  BaseAdapter  
  22. {  
  23.   
  24.      int  mGalleryItemBackground;  
  25.      private  Context    mContext;  
  26.      private  Integer[]  mImageIds;  
  27.      private  ImageView[] mImages;  
  28.   
  29.      public  ImageAdapter(Context c, Integer[] ImageIds)   
  30.      {  
  31.          mContext  = c;  
  32.          mImageIds = ImageIds;  
  33.          mImages   = new  ImageView[mImageIds.length];  
  34.      }  
  35.   
  36.      public   boolean  createReflectedImages()   
  37.      {  
  38.          final   int  reflectionGap =  4 ;  
  39.          int  index =  0 ;  
  40.   
  41.          for  ( int  imageId : mImageIds)  
  42.          {  
  43.              Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);  
  44.              int  width  = originalImage.getWidth();  
  45.              int  height = originalImage.getHeight();  
  46.   
  47.              Matrix matrix = new  Matrix();  
  48.              matrix.preScale(1 , - 1 );  
  49.   
  50.              Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0 , height /  2 , width, height /  2 , matrix,  false );  
  51.   
  52.              Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2 ), Config.ARGB_8888);  
  53.   
  54.              Canvas canvas = new  Canvas(bitmapWithReflection);  
  55.   
  56.              canvas.drawBitmap(originalImage, 00null );  
  57.   
  58.              Paint deafaultPaint = new  Paint();  
  59.              canvas.drawRect(0 , height, width, height + reflectionGap, deafaultPaint);  
  60.   
  61.              canvas.drawBitmap(reflectionImage, 0 , height + reflectionGap,  null );  
  62.   
  63.              Paint paint = new  Paint();  
  64.              LinearGradient shader = new  LinearGradient( 0 , originalImage.getHeight(),  0 , bitmapWithReflection.getHeight()  
  65.                                                         + reflectionGap, 0x70ffffff0x00ffffff , TileMode.CLAMP);  
  66.   
  67.              paint.setShader(shader);  
  68.   
  69.              paint.setXfermode(new  PorterDuffXfermode(Mode.DST_IN));  
  70.   
  71.              canvas.drawRect(0 , height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);  
  72.   
  73.              ImageView imageView = new  ImageView(mContext);  
  74.              imageView.setImageBitmap(bitmapWithReflection);  
  75.              imageView.setLayoutParams(new  GalleryFlow.LayoutParams( 250340 ));  
  76.              imageView.setScaleType(ScaleType.FIT_XY);  
  77.              mImages[index++] = imageView;  
  78.          }  
  79.          return   true ;  
  80.      }  
  81.   
  82.      private  Resources getResources()   
  83.      {  
  84.          // TODO Auto-generated method stub   
  85.          return   null ;  
  86.      }  
  87.   
  88.      public   int  getCount()   
  89.      {  
  90.          return  mImageIds.length;  
  91.      }  
  92.   
  93.      public  Object getItem( int  position)  
  94.      {  
  95.          return  position;  
  96.      }  
  97.   
  98.      public   long  getItemId( int  position)  
  99.      {  
  100.          return  position;  
  101.      }  
  102.   
  103.      public  View getView( int  position, View convertView, ViewGroup parent)  
  104.      {  
  105.          return  mImages[position];  
  106.      }  
  107.   
  108.      public   float  getScale( boolean  focused,  int  offset)   
  109.      {  
  110.          return  Math.max( 01 .0f / ( float ) Math.pow( 2 , Math.abs(offset)));  
  111.      }  
  112. }  

 

GalleryFlow.java


  1. package  xiaosi.GalleryFlow;  
  2.   
  3. import  android.content.Context;  
  4. import  android.graphics.Camera;  
  5. import  android.graphics.Matrix;  
  6. import  android.util.AttributeSet;  
  7. import  android.view.View;  
  8. import  android.view.animation.Transformation;  
  9. import  android.widget.Gallery;  
  10. import  android.widget.ImageView;  
  11.   
  12. public   class  GalleryFlow  extends  Gallery {  
  13.   
  14.     private  Camera mCamera =  new  Camera();  
  15.     private   int  mMaxRotationAngle =  60 ;  
  16.     private   int  mMaxZoom = - 120 ;  
  17.     private   int  mCoveflowCenter;  
  18.   
  19.     public  GalleryFlow(Context context) {  
  20.             super (context);  
  21.             this .setStaticTransformationsEnabled( true );  
  22.     }  
  23.   
  24.     public  GalleryFlow(Context context, AttributeSet attrs) {  
  25.             super (context, attrs);  
  26.             this .setStaticTransformationsEnabled( true );  
  27.     }  
  28.   
  29.     public  GalleryFlow(Context context, AttributeSet attrs,  int  defStyle) {  
  30.             super (context, attrs, defStyle);  
  31.             this .setStaticTransformationsEnabled( true );  
  32.     }  
  33.   
  34.     public   int  getMaxRotationAngle() {  
  35.             return  mMaxRotationAngle;  
  36.     }  
  37.   
  38.     public   void  setMaxRotationAngle( int  maxRotationAngle) {  
  39.             mMaxRotationAngle = maxRotationAngle;  
  40.     }  
  41.   
  42.     public   int  getMaxZoom() {  
  43.             return  mMaxZoom;  
  44.     }  
  45.   
  46.     public   void  setMaxZoom( int  maxZoom) {  
  47.             mMaxZoom = maxZoom;  
  48.     }  
  49.   
  50.     private   int  getCenterOfCoverflow() {  
  51.             return  (getWidth() - getPaddingLeft() - getPaddingRight()) /  2   
  52.                             + getPaddingLeft();  
  53.     }  
  54.   
  55.     private   static   int  getCenterOfView(View view) {  
  56.             return  view.getLeft() + view.getWidth() /  2 ;  
  57.     }  
  58.   
  59.     protected   boolean  getChildStaticTransformation(View child, Transformation t) {  
  60.   
  61.             final   int  childCenter = getCenterOfView(child);  
  62.             final   int  childWidth = child.getWidth();  
  63.             int  rotationAngle =  0 ;  
  64.   
  65.             t.clear();  
  66.             t.setTransformationType(Transformation.TYPE_MATRIX);  
  67.   
  68.             if  (childCenter == mCoveflowCenter) {  
  69.                     transformImageBitmap((ImageView) child, t, 0 );  
  70.             } else  {  
  71.                     rotationAngle = (int ) ((( float ) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);  
  72.                     if  (Math.abs(rotationAngle) > mMaxRotationAngle) {  
  73.                             rotationAngle = (rotationAngle < 0 ) ? -mMaxRotationAngle  
  74.                                             : mMaxRotationAngle;  
  75.                     }  
  76.                     transformImageBitmap((ImageView) child, t, rotationAngle);  
  77.             }  
  78.   
  79.             return   true ;  
  80.     }  
  81.   
  82.     protected   void  onSizeChanged( int  w,  int  h,  int  oldw,  int  oldh) {  
  83.             mCoveflowCenter = getCenterOfCoverflow();  
  84.             super .onSizeChanged(w, h, oldw, oldh);  
  85.     }  
  86.   
  87.     private   void  transformImageBitmap(ImageView child, Transformation t,  
  88.                     int  rotationAngle) {  
  89.             mCamera.save();  
  90.             final  Matrix imageMatrix = t.getMatrix();  
  91.             final   int  imageHeight = child.getLayoutParams().height;  
  92.             final   int  imageWidth = child.getLayoutParams().width;  
  93.             final   int  rotation = Math.abs(rotationAngle);  
  94.   
  95.             // 在Z轴上正向移动camera的视角,实际效果为放大图片。   
  96.             // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。   
  97.             mCamera.translate(0 .0f,  0 .0f,  100 .0f);  
  98.   
  99.             // As the angle of the view gets less, zoom in   
  100.             if  (rotation < mMaxRotationAngle) {  
  101.                     float  zoomAmount = ( float ) (mMaxZoom + (rotation *  1.5 ));  
  102.                     mCamera.translate(0 .0f,  0 .0f, zoomAmount);  
  103.             }  
  104.   
  105.             // 在Y轴上旋转,对应图片竖向向里翻转。   
  106.             // 如果在X轴上旋转,则对应图片横向向里翻转。   
  107.             mCamera.rotateY(rotationAngle);  
  108.             mCamera.getMatrix(imageMatrix);  
  109.             imageMatrix.preTranslate(-(imageWidth / 2 ), -(imageHeight /  2 ));  
  110.             imageMatrix.postTranslate((imageWidth / 2 ), (imageHeight /  2 ));  
  111.             mCamera.restore();  
  112.     }  
  113. }  

 

源代码:点击打开链接

 

 


原文链接:http://blog.csdn.net/sjf0115/article/details/7264552

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值