Android APIDemos 研读之二:android.graphics.Camera
2013-09-01 15:13
357 查看
此Camera非彼Camera,在android.graphics包里的Camera,可以理解为2D图形系统中的视角,或者照相机的机位,根据透视的原理我们可以实现一些简单的3D效果。
在ApiDemo中可参考那个Rotate3dAnimation例子。
其实Camera就两个方法:translate和rotate,下面逐一探讨一番吧。
代码很简单,做一个小小的自定义View来做试验罢了。我引入的这张图片尺寸是480*600(因为手机是480*854)。
[java] view
plaincopy
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,也很好理解,机位的移动,对图片的影响正好是反向的。
最后要注意的是有两种方法应用这个机位的修改,效果也不一样,说不清,您可以自己尝试一下。
在ApiDemo中可参考那个Rotate3dAnimation例子。
其实Camera就两个方法:translate和rotate,下面逐一探讨一番吧。
代码很简单,做一个小小的自定义View来做试验罢了。我引入的这张图片尺寸是480*600(因为手机是480*854)。
[java] view
plaincopy
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,也很好理解,机位的移动,对图片的影响正好是反向的。
最后要注意的是有两种方法应用这个机位的修改,效果也不一样,说不清,您可以自己尝试一下。
相关文章推荐
- Android APIDemos 研读之二:android.graphics.Camera
- Android APIDemos 研读之一:android.graphics.Movie
- Android APIDemos 研读之一:android.graphics.Movie
- Android ApiDemos示例解析(56):Graphics->BitmapPixels
- Android ApiDemos示例解析(60):Graphics->ColorMatrix
- Android ApiDemos示例解析(63):Graphics->Density
- Android ApiDemos示例解析(72):Graphics->Pictures
- Android ApiDemos示例解析(54):Graphics->BitmapDecode
- Android ApiDemos示例解析(67):Graphics->Layers
- Android ApiDemos示例解析(68):Graphics->MeasureText
- Android Graphics.Camera类学习
- Android ApiDemos示例解析(76):Graphics->Regions
- Android ApiDemos示例解析(59):Graphics->ColorFilters
- Android ApiDemos示例解析(69):Graphics->PathEffects
- Android ApiDemos示例解析(58):Graphics->Clipping
- sc7731 Android 5.1 Camera 学习之二 framework 到 HAL接口整理
- Android ApiDemos示例解析(66):Graphics->FingerPaint
- Android ApiDemos示例解析(203):Graphics->OpenGL ES->GLSurfaceView
- Android ApiDemos示例解析(73):Graphics->Points
- android.graphics.Camera实现图像的旋转、缩放