android.graphics.Camera解读

本文通过自定义View实验,解析了Android中Camera API的工作原理。包括translate和rotate方法的效果及应用,展示了如何通过这些方法实现3D效果。

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

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

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/sharetop/archive/2010/02/01/5277655.aspx

Exception Class: SWT Exception Type: system_server_watchdog Current Executing Process: system_server Trigger time:[2025-10-15 00:02:27.98989] pid:1911 Backtrace: SystemUptimeMs: 8477706 Process: system_server ErrorId: 5cf278cb-ce7c-48de-bc47-db1f831e7324 Build: realme/RMX5108IN/RE6450L1:15/UKQ1.231108.001/V.R4T2.117afec_edd913_e63381:user/release-keys Dropped-Count: 0 ----- Output from /proc/pressure/memory ----- some avg10=1.06 avg60=1.45 avg300=6.09 total=713676352 full avg10=0.48 avg60=0.60 avg300=2.34 total=306293008 ----- End output from /proc/pressure/memory ----- ----- Output from /proc/pressure/cpu ----- some avg10=20.51 avg60=26.30 avg300=44.98 total=4626792366 full avg10=0.00 avg60=0.00 avg300=0.00 total=0 ----- End output from /proc/pressure/cpu ----- ----- Output from /proc/pressure/io ----- some avg10=0.02 avg60=0.48 avg300=1.31 total=183128705 full avg10=0.00 avg60=0.04 avg300=0.05 total=24381248 ----- End output from /proc/pressure/io ----- CPU usage from 414ms to 12280ms later (2025-10-15 00:02:15.127 to 2025-10-15 00:02:26.993): 125% 30102/camerahalserver: 91% user + 34% kernel / faults: 192114 minor 16 major 89% 5192/com.oplus.camera: 58% user + 31% kernel / faults: 43106 minor 13 major 79% 5695/com.oplus.autotest.otest.host: 69% user + 10% kernel / faults: 54 minor 23% 1246/surfaceflinger: 15% user + 8.4% kernel / faults: 2536 minor 52 major 20% 29890/cameraserver: 9% user + 11% kernel / faults: 152223 minor 3 major 15% 1911/system_server: 6.3% user + 8.7% kernel / faults: 2698 minor 91 major 12% 568/logd: 3.1% user + 9.8% kernel / faults: 1843 minor 10% 1110/android.hardware.graphics.composer@3.2-service: 3.4% user + 6.8% kernel / faults: 1841 minor 5 major 6.7% 88/kswapd0: 0% user + 6.7% kernel 5.9% 512/ux_page_pool_fillthread: 0% user + 5.9% kernel 69% TOTAL: 35% user + 26% kernel + 0.2% iowait + 6.1% irq + 0.7% softirq Data File: /data/anr/anr_1911_2025-10-15-00-02-15-168 Subject: Blocked in handler on i/o thread (android.io) for 62s --- CriticalEventLog ---
最新发布
10-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值