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. "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.     
  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.   
 
  • TextBitmap.rar (2.2 MB)
  • 下载次数: 266

更多相关文章

  1. Android 图片压缩的方法大全
  2. GridView 加载并显示本地图片
  3. android Gide加载webp图片方法
  4. android避免decodeResource图片时占用太大的内存。
  5. android 图片全屏
  6. Android 图片缩放,手势,事件
  7. Android图片圆角处理
  8. Android如何通过代码将res里的图片转换成drawable.

随机推荐

  1. android crash 调试
  2. Android(安卓)Studio的各种冷知识,黑科技
  3. 让Android应用程序申请获取ROOT权限
  4. Android中service的使用
  5. Android(安卓)Studio修改项目编译版本
  6. 如何调试 Android(安卓)Native Framework
  7. 在cocos2d-x2.0上用shader实现灰度图
  8. view中显示部分区域
  9. Android(安卓)Loader详解二:使用加载器
  10. Android(安卓)DialogFragment底部弹出菜