`
fuerbosi
  • 浏览: 464780 次
文章分类
社区版块
存档分类
最新评论

Android控件Gallery 3D效果

 
阅读更多

本人最近在结合网上资料整理出了Android Gallery 3D效果,因为我们后面项目中需要这个效果,所以提前研究下,在这里和大家分享下,希望互相交流,共同进步。

Android控件Gallery 3D效果如下:



本文源码下载在:

在Linux公社的1号FTP服务器里,下载地址:

FTP地址:ftp://www.linuxidc.com

用户名:www.linuxidc.com

密码:www.muu.cc

在 2011年LinuxIDC.com\8月\Android控件Gallery 3D效果源码

下载方法见这里 http://www.linuxidc.net/thread-1187-1-1.html

1.扩展Gallery:

    public class GalleryFlow extends Gallery {   
        private Camera mCamera = new Camera();//相机类   
        private int mMaxRotationAngle = 60;//最大转动角度   
        private int mMaxZoom = -300;////最大缩放值   
        private int mCoveflowCenter;//半径值   
        public GalleryFlow(Context context) {   
            super(context);   
            //支持转换 ,执行getChildStaticTransformation方法   
            this.setStaticTransformationsEnabled(true);   
        }   
        public GalleryFlow(Context context, AttributeSet attrs) {   
            super(context, attrs);   
            this.setStaticTransformationsEnabled(true);   
        }   
        public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {   
            super(context, attrs, defStyle);   
            this.setStaticTransformationsEnabled(true);   
        }   
        public int getMaxRotationAngle() {   
            return mMaxRotationAngle;   
        }   
        public void setMaxRotationAngle(int maxRotationAngle) {   
            mMaxRotationAngle = maxRotationAngle;   
        }   
        public int getMaxZoom() {   
            return mMaxZoom;   
        }   
        public void setMaxZoom(int maxZoom) {   
            mMaxZoom = maxZoom;   
        }   
        private int getCenterOfCoverflow() {   
            return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2  
                            + getPaddingLeft();   
        }   
        private static int getCenterOfView(View view) {   
            System.out.println("view left :"+view.getLeft());   
            System.out.println("view width :"+view.getWidth());   
            return view.getLeft() + view.getWidth() / 2;   
        }   
           
           
       //控制gallery中每个图片的旋转(重写的gallery中方法)   
        protected boolean getChildStaticTransformation(View child, Transformation t) {     
            //取得当前子view的半径值   
            final int childCenter = getCenterOfView(child);   
            System.out.println("childCenter:"+childCenter);   
            final int childWidth = child.getWidth();   
            //旋转角度   
            int rotationAngle = 0;   
            //重置转换状态   
            t.clear();   
            //设置转换类型   
            t.setTransformationType(Transformation.TYPE_MATRIX);   
            //如果图片位于中心位置不需要进行旋转   
            if (childCenter == mCoveflowCenter) {   
                transformImageBitmap((ImageView) child, t, 0);   
            } else {   
                //根据图片在gallery中的位置来计算图片的旋转角度   
                rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);   
                System.out.println("rotationAngle:" +rotationAngle);   
                //如果旋转角度绝对值大于最大旋转角度返回(-mMaxRotationAngle或mMaxRotationAngle;)   
                if (Math.abs(rotationAngle) > mMaxRotationAngle) {   
                    rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;   
                }   
                transformImageBitmap((ImageView) child, t, rotationAngle);   
            }   
            return true;   
        }   
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {   
            mCoveflowCenter = getCenterOfCoverflow();   
            super.onSizeChanged(w, h, oldw, oldh);   
        }   
        private void transformImageBitmap(ImageView child, Transformation t,   
                        int rotationAngle) {   
            //对效果进行保存   
            mCamera.save();   
            final Matrix imageMatrix = t.getMatrix();   
            //图片高度   
            final int imageHeight = child.getLayoutParams().height;   
            //图片宽度   
            final int imageWidth = child.getLayoutParams().width;   
               
            //返回旋转角度的绝对值   
            final int rotation = Math.abs(rotationAngle);   
               
            // 在Z轴上正向移动camera的视角,实际效果为放大图片。   
            // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。   
            mCamera.translate(0.0f, 0.0f, 100.0f);   
            // As the angle of the view gets less, zoom in   
            if (rotation < mMaxRotationAngle) {   
                float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));   
                mCamera.translate(0.0f, 0.0f, zoomAmount);   
            }   
            // 在Y轴上旋转,对应图片竖向向里翻转。   
            // 如果在X轴上旋转,则对应图片横向向里翻转。   
            mCamera.rotateY(rotationAngle);   
            mCamera.getMatrix(imageMatrix);   
            imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));   
            imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));   
            mCamera.restore();   
        }   
    }  

2、填充图片容器(BaseAdapter)

    public class ImageAdapter extends BaseAdapter {   
        int mGalleryItemBackground;   
        private Context mContext;   
        private Integer[] mImageIds;   
        private ImageView[] mImages;   
           
        public ImageAdapter(Context c, Integer[] ImageIds) {   
         mContext = c;   
         mImageIds = ImageIds;   
         mImages = new ImageView[mImageIds.length];   
        }   
        /**  
         * 创建倒影效果  
         * @return  
         */  
        public boolean createReflectedImages() {   
         //倒影图和原图之间的距离   
         final int reflectionGap = 4;   
         int index = 0;   
         for (int imageId : mImageIds) {   
          //返回原图解码之后的bitmap对象   
          Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId);   
          int width = originalImage.getWidth();   
          int height = originalImage.getHeight();   
          //创建矩阵对象   
          Matrix matrix = new Matrix();   
             
          //指定一个角度以0,0为坐标进行旋转   
          // matrix.setRotate(30);   
             
          //指定矩阵(x轴不变,y轴相反)   
          matrix.preScale(1, -1);   
             
          //将矩阵应用到该原图之中,返回一个宽度不变,高度为原图1/2的倒影位图   
          Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,   
            height/2, width, height/2, matrix, false);   
             
          //创建一个宽度不变,高度为原图+倒影图高度的位图   
          Bitmap bitmapWithReflection = Bitmap.createBitmap(width,   
            (height + height / 2), Config.ARGB_8888);   
             
          //将上面创建的位图初始化到画布   
          Canvas canvas = new Canvas(bitmapWithReflection);   
          canvas.drawBitmap(originalImage, 0, 0, null);   
             
          Paint deafaultPaint = new Paint();    
          deafaultPaint.setAntiAlias(false);   
    //    canvas.drawRect(0, height, width, height + reflectionGap,deafaultPaint);   
          canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);   
          Paint paint = new Paint();   
          paint.setAntiAlias(false);   
              
          /**  
           * 参数一:为渐变起初点坐标x位置,  
           * 参数二:为y轴位置,  
           * 参数三和四:分辨对应渐变终点,  
           * 最后参数为平铺方式,  
           * 这里设置为镜像Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变  
           */  
          LinearGradient shader = new LinearGradient(0,originalImage.getHeight(), 0,   
                  bitmapWithReflection.getHeight() + reflectionGap,0x70ffffff, 0x00ffffff, TileMode.MIRROR);   
          //设置阴影   
          paint.setShader(shader);   
          paint.setXfermode(new PorterDuffXfermode(Android.graphics.PorterDuff.Mode.DST_IN));   
          //用已经定义好的画笔构建一个矩形阴影渐变效果   
          canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()+ reflectionGap, paint);   
             
          //创建一个ImageView用来显示已经画好的bitmapWithReflection   
          ImageView imageView = new ImageView(mContext);   
          imageView.setImageBitmap(bitmapWithReflection);   
          //设置imageView大小 ,也就是最终显示的图片大小   
          imageView.setLayoutParams(new GalleryFlow.LayoutParams(300, 400));   
          //imageView.setScaleType(ScaleType.MATRIX);   
          mImages[index++] = imageView;   
         }   
         return true;   
        }   
        @SuppressWarnings("unused")   
        private Resources getResources() {   
            return null;   
        }   
        public int getCount() {   
            return mImageIds.length;   
        }   
        public Object getItem(int position) {   
            return position;   
        }   
        public long getItemId(int position) {   
            return position;   
        }   
        public View getView(int position, View convertView, ViewGroup parent) {   
            return mImages[position];   
        }   
        public float getScale(boolean focused, int offset) {   
            return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));   
        }   
       }  

3.创建Activity:
    public class Gallery3DActivity extends Activity {   
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
               
               
            setContentView(R.layout.layout_gallery);   
               
            Integer[] images = { R.drawable.img0001, R.drawable.img0030,   
                    R.drawable.img0100, R.drawable.img0130, R.drawable.img0200,   
                    R.drawable.img0230,  R.drawable.img0330,R.drawable.img0354 };   
               
            ImageAdapter adapter = new ImageAdapter(this, images);   
            adapter.createReflectedImages();//创建倒影效果   
            GalleryFlow galleryFlow = (GalleryFlow) this.findViewById(R.id.Gallery01);   
            galleryFlow.setFadingEdgeLength(0);   
            galleryFlow.setSpacing(-100); //图片之间的间距   
            galleryFlow.setAdapter(adapter);   
               
            galleryFlow.setOnItemClickListener(new OnItemClickListener() {   
                public void onItemClick(AdapterView<?> parent, View view,   
                        int position, long id) {   
                    Toast.makeText(getApplicationContext(), String.valueOf(position), Toast.LENGTH_SHORT).show();   
                }   
                   
            });   
            galleryFlow.setSelection(4);   
        }   
    }  

以上实现代码里面我都做了注释相信大家完全可以看懂。稍微解释下,在BaseAdapter中主要做了图片的倒影效果以及创建了对原始图片和倒影的显示区域。GalleryFlow中主要做了对图片的旋转和缩放操作,根据图片的屏幕中的位置对其进行旋转缩放操作。
转帖;http://www.linuxidc.com/Linux/2011-08/41159p3.htm

分享到:
评论

相关推荐

    Android控件Gallery3D效果实例代码

    扩展Gallery: 代码如下: public class GalleryFlow extends Gallery { private Camera mCamera = new Camera();//相机类 private int mMaxRotationAngle = 60;//最大转动角度 private int mMaxZoom = -300;////最大...

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

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

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

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

    Android3D效果Gallery 可直接运行源码

    Android3D效果Gallery 可直接运行源码 用的图片简单,但效果明显 借用了别人的代码效果 共享一下可直接运行的程序

    android自定义3d画廊效果

    这是一个android下的自定义控件,3d的Gallery效果,详细请参见: http://blog.csdn.net/allen315410/article/details/39932689

    Android 使用Gallery实现3D相册(附效果图+Demo源码)

    今天主要是说说如何实现Gallery的3D显示切换,Demo的代码很多是基于网上一些现成效果,感谢这些分享成果的开发者

    基于OpenGL实现的类似Gallery控件的滑动效果

    Android开发中有一个Gallery控件直接调用可以实现水平滑动效果,若需要实现垂直方向上或者比较3D效果的滑动则需要重写该类,而基于OpenGL同样可以实现该种效果,加上OpenGl控件上多了一个Z方向,更能实现3D的效果,...

    Android自定义Gallery控件实现3D图片浏览器

    主要介绍了Android自定义Gallery控件实现3D图片浏览器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    android 3D画廊效果

    完全自定义的gallery控件,仿照ios的3D画廊效果,代码里边的注释很清楚了,看了就会了。

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

    Android高级图片滚动控件,3D版的图片轮播器Demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android-app.rar

    Android 使用Gallery_tabhost实现标签效果图源码 Android 例子源码根据CPU使用时间计算程序电量使用 Android 医院介绍电子书籍源码 android 图片涂鸦 Android 基于局域网的P2P聊天系统 Android 天气预报 Android ...

    android开发资料大全

    android控件的抖动效果 很漂亮的ListView android 图像处理滤镜 照亮边缘特效 无闪烁启动画面 Android实现《天女散花》效果--(带源码) 天天动听 半透明Menu效果 Android 小項目之---Iphone拖动图片特效 (附源码) ...

    android-3d-carousel-view:Android 的自定义轮播视图

    android-3d-carousel-view 数据控件有多种形式,最常用的一种是列表视图。 随着新兴的“手指友好”技术的出现,开发了各种控件以利用更轻松的数据浏览。 Android 本身支持 Gallery 视图,但这至少看起来有点“未...

    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、...

    android开发demo集合

    46、Gallery3d效果 47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换...

    《Android应用开发揭秘》附带光盘代码.

     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 状态栏提示...

Global site tag (gtag.js) - Google Analytics