android.graphics.Camera解读

此Camera非彼Camera,在android.graphics包里的Camera,可以理解为2D图形系统中的视角,或者照相机的机位,根据透视的原理我们可以实现一些简单的3D效果。

在ApiDemo中可参考那个Rotate3dAnimation例子。

其实Camera就两个方法:translate和rotate,下面逐一探讨一番吧。

代码很简单,做一个小小的自定义View来做试验罢了。我引入的这张图片尺寸是480*600(因为手机是480*854)。

view plaincopy to clipboardprint?
protected void onDraw(Canvas canvas) {  
            canvas.drawColor(0xFFCCCCCC);     
             
            //Log.d(TAG,"bit w "+bitmap.getWidth()+",h "+bitmap.getHeight());  
             
            Paint paint = new Paint();  
            paint.setColor(Color.DKGRAY);  
            paint.setStrokeWidth(2.0f);  
            paint.setStyle(Paint.Style.STROKE);  
             
            canvas.drawLine(0, 600, 480, 600, paint);  
            for(int i=0;50*i<600;i++)  
                canvas.drawLine(0, 50*i, 480, 50*i, paint);  
            for(int i=0;50*i<480;i++)  
                canvas.drawLine(50*i, 0, 50*i, 600, paint);  
             
             
            Matrix matrix = new Matrix();  
             
            Camera c = new Camera();  
            c.save();  
             
            //机位的正向转动引起图片向屏幕里翻转  
            //但是绕Z轴的转动,引起图片平面的旋转(2D效果)  
            c.rotateZ(45);  
             
            //X引起图片向右移动50(正向朝右)  
            //Y引起图片向上移动50(正向朝上)  
            //Z引起图片缩小(正向指向自己)  
            c.translate(100f, 0f, 300f);  
            c.getMatrix(matrix);  
            //c.applyToCanvas(canvas);  
             
            c.restore();  
             
        //移到中心点上  
            matrix.preTranslate(-240, -300);  
            matrix.postTranslate(240, 300);  
             
            canvas.concat(matrix);  
             
            canvas.drawBitmap(bitmap, 0,0,null);  
            //canvas.drawBitmap(bitmap, matrix, null);  
             
             
        }  
    } 
protected void onDraw(Canvas canvas) {
            canvas.drawColor(0xFFCCCCCC);  
          
            //Log.d(TAG,"bit w "+bitmap.getWidth()+",h "+bitmap.getHeight());
          
            Paint paint = new Paint();
            paint.setColor(Color.DKGRAY);
            paint.setStrokeWidth(2.0f);
            paint.setStyle(Paint.Style.STROKE);
          
            canvas.drawLine(0, 600, 480, 600, paint);
            for(int i=0;50*i<600;i++)
                canvas.drawLine(0, 50*i, 480, 50*i, paint);
            for(int i=0;50*i<480;i++)
                canvas.drawLine(50*i, 0, 50*i, 600, paint);
          
          
            Matrix matrix = new Matrix();
          
            Camera c = new Camera();
            c.save();
          
            //机位的正向转动引起图片向屏幕里翻转
            //但是绕Z轴的转动,引起图片平面的旋转(2D效果)
            c.rotateZ(45);
          
            //X引起图片向右移动50(正向朝右)
            //Y引起图片向上移动50(正向朝上)
            //Z引起图片缩小(正向指向自己)
            c.translate(100f, 0f, 300f);
            c.getMatrix(matrix);
            //c.applyToCanvas(canvas);
          
            c.restore();
          
        //移到中心点上
            matrix.preTranslate(-240, -300);
            matrix.postTranslate(240, 300);
          
            canvas.concat(matrix);
          
            canvas.drawBitmap(bitmap, 0,0,null);
            //canvas.drawBitmap(bitmap, matrix, null);
          
          
        }
    }

通过实验可知:

translate(x,y,z),很好理解,见代码中的注释。坐标轴似乎与我们常规的理解不一样?为什么会这样呢?
rotateX,rotateY,rotateZ,也很好理解,机位的移动,对图片的影响正好是反向的。

最后要注意的是有两种方法应用这个机位的修改,效果也不一样,说不清,您可以自己尝试一下。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sharetop/archive/2010/02/01/5277655.aspx

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值