android 3D gallery&nbs…

原创 2015年07月07日 11:33:43
  1. import android.content.Context;  
  2. import android.graphics.Camera;  
  3. import android.graphics.Matrix;  
  4. import android.os.AsyncTask;  
  5. import android.util.AttributeSet;  
  6. import android.view.MotionEvent;  
  7. import android.view.View;  
  8. import android.view.animation.Transformation;  
  9. import android.widget.AdapterView;  
  10. import android.widget.Gallery;  
  11. import android.widget.ImageView;  
  12.   
  13. import com.hk.shop.comm.Comm;  
  14.   
  15.   
  16. public class HKGallery4Module extends Gallery {  
  17.     Context context;  
  18.     // 以下属性用于处理3d  
  19.     private Camera camera = new Camera();// 相机类  
  20.     private int maxRotationAngle = 60;// 最大转动角度  
  21.     private int maxZoom = 60;// z方向的移动至,相当于缩放  
  22.     private int coveflowCenter;// 半径值  
  23.     private int height;  
  24.   
  25.     // 以下属性用于处理获取当前选中的项  
  26.     private int currentPosition;  
  27.     private int lastPosition;  
  28.   
  29.     public int getLastPosition() {  
  30.         return lastPosition;  
  31.     }  
  32.   
  33.     public void setLastPosition(int lastPosition) {  
  34.         this.lastPosition = lastPosition;  
  35.     }  
  36.   
  37.     boolean isItemSelectedChange;// 选中的项是否发生了变化  
  38.   
  39.     public HKGallery4Module(Context context, AttributeSet attrs, int defStyle) {  
  40.         super(context, attrs, defStyle);  
  41.         this.context = context;  
  42.         this.setStaticTransformationsEnabled(true);  
  43.         ini();  
  44.     }  
  45.   
  46.     public HKGallery4Module(Context context, AttributeSet attrs) {  
  47.         super(context, attrs);  
  48.         this.context = context;  
  49.         this.setStaticTransformationsEnabled(true);  
  50.         ini();  
  51.     }  
  52.   
  53.     public HKGallery4Module(Context context) {  
  54.         super(context);  
  55.         this.context = context;  
  56.         this.setStaticTransformationsEnabled(true);  
  57.         ini();  
  58.     }  
  59.   
  60.     void ini() {  
  61.         setOnItemSelectedListener(new OnItemSelectedListener() {  
  62.   
  63.             @Override  
  64.             public void onItemSelected(AdapterView
  65. parent, View view,  
  66.                     int position, long id) {  
  67.                 setCurrentPosition(position);  
  68.                 isItemSelectedChange = true;  
  69.             }  
  70.   
  71.             @Override  
  72.             public void onNothingSelected(AdapterView<?> parent) {  
  73.   
  74.             }  
  75.         });  
  76.     }  
  77.   
  78.     // ------------------------以下用户处理获取当前选中项------------------------//  
  79.     @Override  
  80.     public boolean onTouchEvent(MotionEvent event) {  
  81.         if (event.getAction() == MotionEvent.ACTION_UP) {  
  82.             JudgeTask task = new JudgeTask();  
  83.             task.execute(); // 手离开开始执行,判断gallery是否停止  
  84.         }  
  85.         return super.onTouchEvent(event);  
  86.     }  
  87.   
  88.     // ------------------判断停止----------------//  
  89.     class JudgeTask extends AsyncTask<Object, Object, Object> {  
  90.         int i = -1;// 测试  
  91.   
  92.         @Override  
  93.         protected Object doInBackground(Object... params) {  
  94.   
  95.             // 每500毫秒执行一次判断,实验证明可以精确判断  
  96.             try {  
  97.                 do {  
  98.                     i++;  
  99.                     lastPosition = getCurrentPosition();  
  100.                     Thread.sleep(500);  
  101.                 } while (lastPosition != getCurrentPosition());  
  102.             } catch (InterruptedException e) {  
  103.             }  
  104.   
  105.             return null;  
  106.         }  
  107.   
  108.         @Override  
  109.         protected void onPostExecute(Object result) {  
  110.             Comm.print("getCurrentPosition----- " + getCurrentPosition());  
  111.             // 已经停止  
  112.             // 如果选中的项发生了变化,执行...  
  113.             if (isItemSelectedChange) {  
  114.                 if (null != onSelectedChange) {  
  115.                     onSelectedChange.onSelectedChange(getCurrentPosition());  
  116.                 }  
  117.             }  
  118.             isItemSelectedChange = false;  
  119.             super.onPostExecute(result);  
  120.         }  
  121.     }  
  122.   
  123.     protected HKGallerySelectedChange onSelectedChange;  
  124.   
  125.     public void setOnSelectedChange(HKGallerySelectedChange c) {  
  126.         this.onSelectedChange = c;  
  127.     }  
  128.       
  129.     public interface HKGallerySelectedChange {  
  130.   
  131.         public void onSelectedChange(int position);  
  132.   
  133.     }  
  134.   
  135.   
  136.     // ------------------------以下用户处理3d效果------------------------//  
  137.     @Override  
  138.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  139.         super.onLayout(changed, l, t, r, b);  
  140.         height = getHeight();  
  141.     }  
  142.   
  143.     public int getMaxRotationAngle() {  
  144.         return maxRotationAngle;  
  145.     }  
  146.   
  147.     public void setMaxRotationAngle(int maxRotationAngle) {  
  148.         this.maxRotationAngle = maxRotationAngle;  
  149.     }  
  150.   
  151.     public int getMaxZoom() {  
  152.         return maxZoom;  
  153.     }  
  154.   
  155.     public void setMaxZoom(int maxZoom) {  
  156.         this.maxZoom = maxZoom;  
  157.     }  
  158.   
  159.     private int getCenterOfCoverflow() {  
  160.         return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2  
  161.                 + getPaddingLeft();  
  162.     }  
  163.   
  164.     private static int getCenterOfView(View view) {  
  165.         return view.getLeft() + view.getWidth() / 2;  
  166.     }  
  167.   
  168.     // 控制gallery中每个图片的旋转(重写的gallery中方法)  
  169.     @Override  
  170.     protected boolean getChildStaticTransformation(View child, Transformation t) {  
  171.         // 取得当前子view的半径值  
  172.         final int childCenter = getCenterOfView(child);  
  173.         final int childWidth = child.getWidth();  
  174.         // 旋转角度  
  175.         int rotationAngle = 0;  
  176.         // 重置转换状态  
  177.         t.clear();  
  178.         // 设置转换类型  
  179.         t.setTransformationType(Transformation.TYPE_BOTH);  
  180.         // 如果图片位于中心位置不需要进行旋转  
  181.         if (childCenter == coveflowCenter) {  
  182.             transformImageBitmap((ImageView) child, t, 0);  
  183.         } else {  
  184.             // 根据图片在gallery中的位置来计算图片的旋转角度  
  185.             rotationAngle = (int) (((float) (coveflowCenter - childCenter) / childWidth) * maxRotationAngle);  
  186.             // 如果旋转角度绝对值大于最大旋转角度返回(-mMaxRotationAngle或mMaxRotationAngle;)  
  187.             if (Math.abs(rotationAngle) > maxRotationAngle) {  
  188.                 rotationAngle = (rotationAngle < 0) ? -maxRotationAngle  
  189.                         : maxRotationAngle;  
  190.             }  
  191.             transformImageBitmap((ImageView) child, t, rotationAngle);  
  192.         }  
  193.         return true;  
  194.     }  
  195.   
  196.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  197.         coveflowCenter = getCenterOfCoverflow();  
  198.         super.onSizeChanged(w, h, oldw, oldh);  
  199.     }  
  200.   
  201.     private void transformImageBitmap(ImageView child, Transformation t,  
  202.             int rotationAngle) {  
  203.         // 对效果进行保存  
  204.         camera.save();  
  205.   
  206.         // 返回旋转角度的绝对值  
  207.         // final int rotation = Math.abs(rotationAngle);  
  208.   
  209.         // 在Z轴上正向移动camera的视角,实际效果为放大图片。  
  210.         // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。  
  211.         camera.translate(0f, 0f, maxZoom);  
  212.         // // 精确的缩放控制  
  213.         // if (rotation < mMaxRotationAngle) {  
  214.         // float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));  
  215.         // mCamera.translate(0.0f, 0.0f, zoomAmount);  
  216.         // }  
  217.         // 如果在Y轴上旋转,对应图片竖向向里翻转。  
  218.         // 如果在X轴上旋转,对应图片横向向里翻转。  
  219.         camera.rotateY(rotationAngle);  
  220.         final Matrix imageMatrix = t.getMatrix();  
  221.         camera.getMatrix(imageMatrix);  
  222.         camera.restore();  
  223.   
  224.         // 设置旋转中心点  
  225.         // 图片高度,用的gallery的高度  
  226.         // 图片宽度,用的图片宽度;这里图片的高度取不到,都是-1,不知道什么原因  
  227.         final int imageWidth = child.getLayoutParams().width;  
  228.   
  229.         imageMatrix.preTranslate(-(imageWidth / 2), -height / 2);  
  230.         imageMatrix.postTranslate((imageWidth / 2), height / 2);  
  231.         camera.save();  
  232.     }  
  233.   
  234.     public int getCurrentPosition() {  
  235.         return currentPosition;  
  236.     }  
  237.   
  238.     public void setCurrentPosition(int currentPosition) {  
  239.         this.currentPosition = currentPosition;  
  240.     }  
  241.   
  242. }  
  243. 转载: http://zheyiw.iteye.com/blog/1594819
版权声明:本文为博主原创文章,未经博主允许不得转载。

使用空格或者&nbsp 在IE、firefox、chrome浏览器中显示距离不一致

空格在ie、firefox、chrome浏览器上显示的效果不太一样,主要是前面的空格宽度不同,这可能是因为不同的浏览器会有不同的默认字体,一般 IE默认字体都是宋体,下面为大家介绍几种不错的解决方法 ...
  • u013381651
  • u013381651
  • 2016年05月24日 17:52
  • 1802

HTML中&nbsp 和空格的区别

刚刚学写HTML代码时候,我曾碰到这样的问题:在代码里加入一连串空格,在浏览器上显示的时候,却只看到一个空格。常用的解决方法是,用" "来代替空格,一个" "相当于一个空格,多加几个" "就可以把空格...
  • you1314520me
  • you1314520me
  • 2013年09月19日 18:26
  • 44614

&nbsp在IE和FireFox中显示不一致

在代码中为有关区块中的字设置字体即可,比如这里将上述需要格式化的“密 码”的字体设置为宋体: font-family :"宋体" ; 当然设置成其他字体,如楷体、...
  • huyuyang6688
  • huyuyang6688
  • 2014年08月20日 15:31
  • 2325

如果让你只推荐一本&nbsp;Java&amp;nbs…

转载:http://www.zhihu.com/question/19848946 【一.Java架构师之路:JAVA程序员必看的15本书】 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太...
  • seasongu
  • seasongu
  • 2014年12月11日 18:54
  • 539

微软企业库的&nbsp;注入和依赖&amp;nbs…

Working with ObjectBuilder This topic has not yet been rated - Rate this topic Retired Conten...
  • fz2543122681
  • fz2543122681
  • 2014年03月24日 13:08
  • 533

Unity3D中摄像机常用技巧Dolly&amp;nbs…

最近学习Unity3D文档的过程中,看到了几种关于摄像机的技巧。其中Dolly Zoom和Oblique Frustum属于摄像机的特效,而Occlusion Culling属于摄像机的优化。这里稍微...
  • u012437415
  • u012437415
  • 2015年06月29日 12:13
  • 598

Unity3D中摄像机常用技巧Dolly&amp;nbs…

最近学习Unity3D文档的过程中,看到了几种关于摄像机的技巧。其中Dolly Zoom和Oblique Frustum属于摄像机的特效,而Occlusion Culling属于摄像机的优化。这里稍微...
  • dfwgwerwrwqe
  • dfwgwerwrwqe
  • 2015年06月22日 09:23
  • 345

3d地面效果&amp;nbsp;

  • 2002年10月15日 00:00
  • 11KB
  • 下载

3D交互引擎&amp;nbsp;

  • 2002年10月15日 00:00
  • 56KB
  • 下载

3d盒子菜单&amp;nbsp;

  • 2002年10月15日 00:00
  • 57KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android&nbsp;3D&nbsp;gallery&amp;nbs…
举报原因:
原因补充:

(最多只允许输入30个字)