`

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, 0 0 null );  
  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, 0x70ffffff 0x00ffffff , 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( 250 340 ));  
  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( 0 1 .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

分享到:
评论
1 楼 yun2223 2012-09-17  
对楼主表示感谢

相关推荐

    Android控件开发之Gallery3D酷炫效果(带源码)

    Android控件开发之Gallery3D酷炫效果(带源码),功能简单,欢迎下载

    Android控件Gallery3D效果实例代码

    《Android控件Gallery3D效果实现详解》 在Android应用开发中,为了提供更丰富的用户交互体验,常常会使用到一些特殊效果的控件。其中,Gallery3D效果就是一个非常吸引眼球的设计,它能实现类似3D翻转的图片浏览体验...

    Android TV开发:实现3D仿Gallery效果的实例代码

    本文讲述了Android TV开发:实现3D仿Gallery效果的实例代码。分享给大家供大家参考,具体如下: 1.实现效果: 滚动翻页+ 页面点击+页码指示器+焦点控制 2.实现这个效果之前必须要了解 Android高级图片滚动控件实现3D...

    android 动态向Gallery中添加图片及倒影&&3D;效果

    在Android开发中,`Gallery`组件是一个非常有趣的控件,它可以用来展示一系列的图片或其它内容,用户可以左右滑动来浏览。本教程将详细讲解如何动态地向`Gallery`中添加图片,并实现倒影与3D翻转效果,使应用的用户...

    android自定义3d画廊效果

    在Android开发中,自定义控件是提升应用用户体验和视觉效果的重要手段。"android自定义3d画廊效果"是一个专为Android平台设计的特色功能,它通过实现3D视角的图片滚动效果,为用户提供了新颖且引人入胜的交互体验。...

    Android自定义控件(3D画廊)

    这篇博客文章 "Android自定义控件(3D画廊)" 提供了一个实现这种效果的教程,下面将详细讲解相关知识点。 1. **自定义控件基础**:Android系统允许开发者创建自己的视图组件,通过继承现有的View或ViewGroup类,...

    Gallery实现了3D效果

    在Android平台上,`Gallery`组件是一个非常有趣且实用的控件,它允许用户在一个水平轴线上滑动浏览项目,常...如果你正在开发一个需要展示大量图片的应用,那么这样的3D`Gallery`效果无疑是一个值得尝试的特色功能。

    Gallery 3D效果

    总的来说,"Gallery 3D效果"涉及了位图操作、自定义视图、3D变换、动画以及可能的OpenGL ES使用,这些都是Android开发中高级和核心的技术点。通过实践和研究,开发者可以提升自己在这些领域的技能,从而构建出更具...

    gallery 3D效果

    1. **自定义View**:Android系统默认的Gallery控件无法满足需求,因此需要创建一个自定义的View类,继承自Gallery,并覆盖其onDraw()方法,以便绘制3D效果。 2. **3D旋转**:利用Android的Canvas和Matrix类,可以...

    Android3D效果Gallery 可直接运行源码

    在Android开发领域,3D效果的应用为用户界面带来了生动且吸引人的体验。"Android3D效果Gallery 可直接运行源码"项目就是这样一个实例,它展示了如何在Android应用中实现一个3D效果的图片画廊。这个项目允许开发者...

    安卓Gallery照片墙画廊图库相关-Android高级图片滚动控件3D版的图片轮播器Demo.rar

    "安卓Gallery照片墙画廊图库相关-Android高级图片滚动控件3D版的图片轮播器Demo" 提供了一个独特的解决方案,通过3D效果来提升用户的视觉体验。这个Demo旨在展示如何实现一个高级的图片滚动控件,它可能是基于开源库...

    android 3D画廊效果

    综上所述,"android 3D画廊效果"项目是一个深度自定义的Android控件示例,它展示了如何通过创新和技巧来增强用户体验。通过研究和实践这个项目,开发者不仅可以掌握自定义控件和动画的实现,还能提高在Android平台上...

    炫酷 自定义控件 3D绘制 画廊效果

    总结来说,"炫酷自定义控件3D绘制画廊效果"是一个利用3D图形技术和创新设计实现的Android控件,它可以提供一种独特且吸引人的图片浏览方式,是开发者提升应用体验和视觉效果的一个好选择。理解并掌握这种3D画廊的...

    android开发揭秘PDF

    4.2.15 拖动效果(Gallery) 4.2.16 切换图片(hmgeSwilcher) 4.2.17 网格视图(GridView) 4.2.18 卷轴视图(ScrollView) 4.2.19 进度条(ProgressBar) 4.2.20 拖动条(SeekBar) 4.2.21 状态栏提示(Notification、...

    Gallery3D效果

    "Gallery3D效果"是一个专为初学者设计的Android开发项目,主要展示了如何在应用程序中实现3D图像画廊的效果。这个项目包含了源码和相关的代码说明,方便开发者理解和学习。如果你是Android新手或者对3D图形展示感...

    Android控件例子源码

    本资源包包含了一系列的Android控件示例源码,涵盖了多种类型的控件及其应用,有助于开发者深入理解Android UI设计和动画效果的实现。 1. 10.3 Image Switcher.rar `ImageSwitcher` 是一个用于展示图片切换效果的...

    最新android4.0gallery3d源码

    Android 4.0 Gallery3D源码分析 Gallery3D是Android系统中一个经典的3D图像浏览应用,尤其在Android 4.0(冰淇淋三明治)版本中,它提供了流畅且富有视觉冲击力的用户体验。这个源码是开发者深入理解Android 3D图像...

    Android Gellary3D 源码

    - **com.example.gallery3d.common**: 公共工具类和帮助器,如图片处理、动画效果等。 - **com.example.gallery3d.util**: 辅助工具类,包含线程管理、内存缓存等。 - **com.example.gallery3d.ui**: 用户界面...

    android Gallery 3d实现无限循环播放 用做广告板最后了

    在Android开发中,`Gallery`组件是一个非常有用的控件,它可以用来展示一系列的图片或其它内容,用户可以左右滑动来浏览。然而,原生的`Gallery`在Android API Level 16(Jelly Bean)之后已被废弃。尽管如此,...

Global site tag (gtag.js) - Google Analytics