android Gallery3D效果

http://1002878825-qq-com.iteye.com/blog/1194788

Java代码 

  1. 主页面:Gallery3DActivity  
  2.   
  3.   
  4. package com.xiawenquan;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.widget.AdapterView;  
  10. import android.widget.Toast;  
  11. import android.widget.AdapterView.OnItemClickListener;  
  12.   
  13. public class Gallery3DActivity extends Activity {  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         // TODO Auto-generated method stub  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);     
  20.           
  21.         Integer[] images = { R.drawable.aa, R.drawable.bb,     
  22.                 R.drawable.cc, R.drawable.dd, R.drawable.ee,     
  23.                 R.drawable.ff, /* R.drawable.gg,R.drawable.hh , 
  24.                 R.drawable.jj, R.drawable.kk, R.drawable.ll*/};     
  25.              
  26.         ImageAdapter adapter = new ImageAdapter(this, images);     
  27.         adapter.createReflectedImages();//创建倒影效果     
  28.         GalleryFlow galleryFlow = (GalleryFlow) Gallery3DActivity.this.findViewById(R.id.Gallery01);     
  29.         galleryFlow.setFadingEdgeLength(0);     
  30.         galleryFlow.setSpacing(-50); //图片之间的间距     
  31.         galleryFlow.setAdapter(adapter);     
  32.              
  33.         galleryFlow.setOnItemClickListener(new OnItemClickListener() {     
  34.             public void onItemClick(AdapterView<?> parent, View view,     
  35.                     int position, long id) {     
  36.                 Toast.makeText(getApplicationContext(), String.valueOf(position), Toast.LENGTH_SHORT).show();     
  37.             }     
  38.                  
  39.         });     
  40.         galleryFlow.setSelection(0);     
  41.     }     
  42. }  

 

Java代码 

  1. GalleryFlow类:作用是控制Gallery  
  2.   
  3. package com.xiawenquan;  
  4.   
  5. import android.content.Context;  
  6. import android.graphics.Camera;  
  7. import android.graphics.Matrix;  
  8. import android.util.AttributeSet;  
  9. import android.view.View;  
  10. import android.view.animation.Transformation;  
  11. import android.widget.Gallery;  
  12. import android.widget.ImageView;  
  13.   
  14. public class GalleryFlow extends Gallery {  
  15.   
  16.     private Camera mCamera = new Camera();//相机类  
  17.     private int mMaxRotationAngle = 60;//最大转动角度  
  18.     private int mMaxZoom = -300;////最大缩放值  
  19.     private int mCoveflowCenter;//半径值  
  20.     public GalleryFlow(Context context) {  
  21.         super(context);  
  22.         //支持转换 ,执行getChildStaticTransformation方法  
  23.         this.setStaticTransformationsEnabled(true);  
  24.     }  
  25.     public GalleryFlow(Context context, AttributeSet attrs) {  
  26.         super(context, attrs);  
  27.         this.setStaticTransformationsEnabled(true);  
  28.     }  
  29.     public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {  
  30.         super(context, attrs, defStyle);  
  31.         this.setStaticTransformationsEnabled(true);  
  32.     }  
  33.     public int getMaxRotationAngle() {  
  34.         return mMaxRotationAngle;  
  35.     }  
  36.     public void setMaxRotationAngle(int maxRotationAngle) {  
  37.         mMaxRotationAngle = maxRotationAngle;  
  38.     }  
  39.     public int getMaxZoom() {  
  40.         return mMaxZoom;  
  41.     }  
  42.     public void setMaxZoom(int maxZoom) {  
  43.         mMaxZoom = maxZoom;  
  44.     }  
  45.     private int getCenterOfCoverflow() {  
  46.         return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2  
  47.                         + getPaddingLeft();  
  48.     }  
  49.     private static int getCenterOfView(View view) {  
  50.         System.out.println("view left :"+view.getLeft());  
  51.         System.out.println("view width :"+view.getWidth());  
  52.         return view.getLeft() + view.getWidth() / 2;  
  53.     }  
  54.      
  55.      
  56.    //控制gallery中每个图片的旋转(重写的gallery中方法)  
  57.     @Override  
  58.     protected boolean getChildStaticTransformation(View child, Transformation t) {   
  59.         //取得当前子view的半径值  
  60.         final int childCenter = getCenterOfView(child);  
  61.         System.out.println("childCenter:"+childCenter);  
  62.         final int childWidth = child.getWidth();  
  63.         //旋转角度  
  64.         int rotationAngle = 0;  
  65.         //重置转换状态  
  66.         t.clear();  
  67.         //设置转换类型  
  68.         t.setTransformationType(Transformation.TYPE_MATRIX);  
  69.         //如果图片位于中心位置不需要进行旋转  
  70.         if (childCenter == mCoveflowCenter) {  
  71.             transformImageBitmap((ImageView) child, t, 0);  
  72.         } else {  
  73.             //根据图片在gallery中的位置来计算图片的旋转角度  
  74.             rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);  
  75.             System.out.println("rotationAngle:" +rotationAngle);  
  76.             //如果旋转角度绝对值大于最大旋转角度返回(-mMaxRotationAngle或mMaxRotationAngle;)  
  77.             if (Math.abs(rotationAngle) > mMaxRotationAngle) {  
  78.                 rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;  
  79.             }  
  80.             transformImageBitmap((ImageView) child, t, rotationAngle);  
  81.         }  
  82.         return true;  
  83.     }  
  84.       
  85.     @Override  
  86.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  87.         mCoveflowCenter = getCenterOfCoverflow();  
  88.         super.onSizeChanged(w, h, oldw, oldh);  
  89.     }  
  90.       
  91.     private void transformImageBitmap(ImageView child, Transformation t,  
  92.                     int rotationAngle) {  
  93.         //对效果进行保存  
  94.         mCamera.save();  
  95.         final Matrix imageMatrix = t.getMatrix();  
  96.         //图片高度  
  97.         final int imageHeight = child.getLayoutParams().height;  
  98.         //图片宽度  
  99.         final int imageWidth = child.getLayoutParams().width;  
  100.          
  101.         //返回旋转角度的绝对值  
  102.         final int rotation = Math.abs(rotationAngle);  
  103.          
  104.         // 在Z轴上正向移动camera的视角,实际效果为放大图片。  
  105.         // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。  
  106.         mCamera.translate(0.0f, 10.0f, 300.0f);// 后面的值越高图片越缩小  
  107.         // As the angle of the view gets less, zoom in  
  108.         if (rotation < mMaxRotationAngle) {  
  109.             float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));  
  110.             mCamera.translate(0.0f, 0.0f, zoomAmount);  
  111.         }  
  112.         // 在Y轴上旋转,对应图片竖向向里翻转。  
  113.         // 如果在X轴上旋转,则对应图片横向向里翻转。  
  114.         mCamera.rotateY(rotationAngle);  
  115.         mCamera.getMatrix(imageMatrix);  
  116.         imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));  
  117.         imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));  
  118.         mCamera.restore();  
  119.     }  
  120.   
  121. }  

 

Java代码 

  1. 最后是把图片设置到Gallery中  
  2. ImageAdapter类:  
  3.   
  4. package com.xiawenquan;  
  5.   
  6. import android.content.Context;  
  7. import android.content.res.Resources;  
  8. import android.graphics.Bitmap;  
  9. import android.graphics.BitmapFactory;  
  10. import android.graphics.Canvas;  
  11. import android.graphics.LinearGradient;  
  12. import android.graphics.Matrix;  
  13. import android.graphics.Paint;  
  14. import android.graphics.PorterDuffXfermode;  
  15. import android.graphics.Bitmap.Config;  
  16. import android.graphics.Shader.TileMode;  
  17. import android.view.View;  
  18. import android.view.ViewGroup;  
  19. import android.widget.BaseAdapter;  
  20. import android.widget.ImageView;  
  21. import android.widget.ImageView.ScaleType;  
  22.   
  23. public class ImageAdapter extends BaseAdapter {  
  24.   
  25.     int mGalleryItemBackground;     
  26.     private Context mContext;     
  27.     private Integer[] mImageIds;     
  28.     private ImageView[] mImages;     
  29.          
  30.     public ImageAdapter(Context c, Integer[] ImageIds) {     
  31.      mContext = c;     
  32.      mImageIds = ImageIds;     
  33.      mImages = new ImageView[mImageIds.length];     
  34.     }     
  35.     /**   
  36.      * 创建倒影效果   
  37.      * @return   
  38.      */    
  39.     public boolean createReflectedImages() {     
  40.      //倒影图和原图之间的距离     
  41.      final int reflectionGap = 4;     
  42.      int index = 0;     
  43.      for (int imageId : mImageIds) {     
  44.       //返回原图解码之后的bitmap对象     
  45.       Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);     
  46.       int width = originalImage.getWidth();     
  47.       int height = originalImage.getHeight();     
  48.       //创建矩阵对象     
  49.       Matrix matrix = new Matrix();     
  50.            
  51.       //指定一个角度以0,0为坐标进行旋转     
  52.       // matrix.setRotate(30);     
  53.            
  54.       //指定矩阵(x轴不变,y轴相反)     
  55.       matrix.preScale(1, -1);     
  56.            
  57.       //将矩阵应用到该原图之中,返回一个宽度不变,高度为原图1/2的倒影位图     
  58.       Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,     
  59.         height/2, width, height/2, matrix, false);     
  60.            
  61.       //创建一个宽度不变,高度为原图+倒影图高度的位图     
  62.       Bitmap bitmapWithReflection = Bitmap.createBitmap(width,     
  63.         (height + height / 2), Config.ARGB_8888);     
  64.            
  65.       //将上面创建的位图初始化到画布     
  66.       Canvas canvas = new Canvas(bitmapWithReflection);     
  67.       canvas.drawBitmap(originalImage, 0, 0, null);     
  68.            
  69.       Paint deafaultPaint = new Paint();      
  70.       deafaultPaint.setAntiAlias(false);     
  71. //    canvas.drawRect(0, height, width, height + reflectionGap,deafaultPaint);     
  72.       canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);     
  73.       Paint paint = new Paint();     
  74.       paint.setAntiAlias(false);     
  75.             
  76.       /**   
  77.        * 参数一:为渐变起初点坐标x位置,   
  78.        * 参数二:为y轴位置,   
  79.        * 参数三和四:分辨对应渐变终点,   
  80.        * 最后参数为平铺方式,   
  81.        * 这里设置为镜像Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变   
  82.        */    
  83.       LinearGradient shader = new LinearGradient(0,originalImage.getHeight(), 0,     
  84.               bitmapWithReflection.getHeight() + reflectionGap,0x70ffffff, 0x00ffffff, TileMode.MIRROR);     
  85.       //设置阴影     
  86.       paint.setShader(shader);     
  87.       paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN));     
  88.       //用已经定义好的画笔构建一个矩形阴影渐变效果     
  89.       canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()+ reflectionGap, paint);     
  90.            
  91.       //创建一个ImageView用来显示已经画好的bitmapWithReflection     
  92.       ImageView imageView = new ImageView(mContext);     
  93.       imageView.setImageBitmap(bitmapWithReflection);     
  94.       //设置imageView大小 ,也就是最终显示的图片大小     
  95.       imageView.setLayoutParams(new GalleryFlow.LayoutParams(220, 400));     
  96. //      imageView.setScaleType(ScaleType.MATRIX);     
  97.       mImages[index++] = imageView;     
  98.      }     
  99.      return true;     
  100.     }     
  101.     @SuppressWarnings("unused")     
  102.     private Resources getResources() {     
  103.         return null;     
  104.     }     
  105.     public int getCount() {     
  106.         return mImageIds.length;     
  107.     }     
  108.     public Object getItem(int position) {     
  109.         return position;     
  110.     }     
  111.     public long getItemId(int position) {     
  112.         return position;     
  113.     }     
  114.     public View getView(int position, View convertView, ViewGroup parent) {     
  115.         return mImages[position];     
  116.     }     
  117.     public float getScale(boolean focused, int offset) {     
  118.         return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));     
  119.     }     
  120. }  

 

Java代码 

  1. main.xml  
  2.   
  3. <?xml version="1.0" encoding="utf-8"?>  
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  5.     android:orientation="vertical"   
  6.     android:layout_width="fill_parent"  
  7.     android:layout_height="fill_parent" >  
  8.   
  9.     <com.xiawenquan.GalleryFlow  
  10.         android:id="@+id/Gallery01"  
  11.         android:layout_marginTop="20dip"  
  12.         android:layout_width="fill_parent"  
  13.         android:layout_height="wrap_content"  
  14.     />  
  15.   
  16.   
  17.   
  18. </LinearLayout>  

 

时间: 2024-10-27 21:44:01

android Gallery3D效果的相关文章

Android滑动效果进阶篇(六) 倒影效果

上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘制 ImageAdapter继承自 BaseAdapter,详细实现可见 Android 滑动效果入门篇(二)-- Gallery 这里重点介绍倒影原理及实现 倒影原理: 倒影效果是主要由原图+间距+倒影三部分组成,高度大约为原图的3/2(原图为1.倒影为1/2) 原图,就是我们 看到了最开始的图片

Android滑动效果入门篇(二) Gallery

Gallery 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果. 从上面的继承关系可 以看出,AbsSpinner类继承自AdapterView,因此我们可以自定义实现Adapter,来填充Gallery容器的数据. 本示 例通过自己实现一个Adapter,来填充Gallery容器的图片数据,首先看效果: Activity import android.app.Activity; import android.os.Bundle; import

Android相册效果

  这篇文章主要介绍了Android相册效果(使用C#和Java分别实现),原来C#也可以开发APP,小编第一次见了~感觉不错,因为小编暂时不喜欢Java,所以,需要的朋友可以参考下 运行效果 C#实现 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

Android 滑动效果基础篇(三)—— Gallery仿图像集浏览

Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好. 本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图像集的图片浏览效果.效果图如下: 1.基本原理 在 Activity 中实现 OnGestureListener 的接口 onFling() 手势事件,通过自定义的 View 绘制draw() 图片 2.Activity Activity中,通过onTouchEvent() 注册 myGesture.o

Android 动画效果怎么样叠加效果

问题描述 Android 动画效果怎么样叠加效果 我想实现的是,一个控件上面同事拥有两种或者两种以上的动画效果.比如说我给一个ImageView设置了一个移动的动画效果,但是我还想让这个控件在移动的同时进行旋转.这个该怎么做?跪求懂得大神指点 解决方案 AnimationSet as; Animation bs; TranslateAnimation ta; ScaleAnimation sa; RotateAnimation ra; AlphaAnimation aa; ta=new Tran

android 这个效果是怎么实现的?滑动置顶在最上面

问题描述 android 这个效果是怎么实现的?滑动置顶在最上面 滑动置顶 解决方案 设置滚动视图的时候上面一段不加进去就行了把

android 粒子效果的实现 不规则运动

问题描述 android 粒子效果的实现 不规则运动 最近项目中要用到粒子效果,做出来的效果类似萤火虫的不规则闪动,自定义控件学的不好,还望各位大神指教!有相关demo最好! 解决方案 用随机数,随机计算坐标,然后控制组件或者绘制的位置即可 解决方案二: http://www.bubuko.com/infodetail-653559.html可以参考类似的代码 解决方案三: android---粒子雨效果的实现android通过自定义view实现粒子效果展示 解决方案四: [Javascript

求告知android menu效果?

问题描述 求告知android menu效果? 使用基本的菜单,生成的菜单和背景色同色,应该如何将出了菜单部分变成灰色呢? 解决方案 参考:android学习---添加menu 解决方案二: 可以用popupWindow来做这个效果,默认的好像不支持改变颜色

《Android和PHP开发最佳实践》一2.9 Android动画效果

2.9 Android动画效果 适当地使用动画效果可以很好地提升Android应用或游戏的操作体验.目前Android系统支持的动画效果主要有两种,即逐帧动画(Frame Animation)和补间动画(Tween Animation).虽然,在Android 3.0以后的版本中还引入了新的动画系统,但是目前最主流的动画效果还是这两种. 2.9.1 逐帧动画(Frame Animation) 逐帧动画类似于GIF动画图片,即按照顺序播放图片.我们通常会在Android项目的res/drawabl