android.graphics.Camera解读

Android Camera API 实验
本文通过自定义View实验,解析了Android中graphics包下Camera API的使用方法,包括translate和rotate函数的效果,并对比了不同应用方式的区别。

此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、付费专栏及课程。

余额充值