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, 00null);     
  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,0x70ffffff0x00ffffff, 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(220400));     
  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(01.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>  
 

相关文章
|
14天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
189 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
24天前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
93 6
|
3月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
174 11
|
3月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
112 0
|
7月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1383 77
|
4月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
189 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
8月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
463 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
8月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
254 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
8月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
196 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
9月前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
379 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程

热门文章

最新文章