Android APIDemos 研读之二:android.graphics.Camera


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

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

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

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

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,也很好理解,机位的移动,对图片的影响正好是反向的。

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

你可能感兴趣的:(c,android,null,手机,图形,Matrix)