关闭

android 3D gallery&nbs…

200人阅读 评论(0) 收藏 举报
分类:
  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 -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
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22850次
    • 积分:189
    • 等级:
    • 排名:千里之外
    • 原创:95篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档