zoukankan      html  css  js  c++  java
  • android入门:zxing学习笔记(三)

         个人网站:臭蛋 www.choudan.net

      ViewfinderView自定义了view,实现了一个简洁的扫描界面。这一篇记录我再看代码过程中对于Android Camera 的理解。由于才开始写技术类博客,前两篇有很多不足

    之处,都是自己随性而写,估计大家很难对我写的有一个清晰的了解。这篇尝试改变下风格,争取好好的表达我的浅薄理解,也让大家能够看懂。

          在看Barcode Scanner中关于camera代码前,先对android camera开发做个简单的介绍,算是入门。

          首先是使用camera需要用到的权限。

    1 <uses-permission android:name="android.permission.CAMERA"/>
    2 <uses-feature android:name="android.hardware.camera"/>

         如下是一个很简单的camera示例,简单到只能取景,即打开相机,将景象显示在屏幕上,仅此而已。

     1 import java.io.IOException;
    2 import android.app.Activity;
    3 import android.hardware.Camera;
    4 import android.os.Bundle;
    5 import android.view.SurfaceHolder;
    6 import android.view.SurfaceView;
    7
    8 public class CameraTestActivity extends Activity implements SurfaceHolder.Callback {
    9 private SurfaceHolder surfaceHolder;
    10 private Camera camera;
    11 /** Called when the activity is first created. */
    12 @Override
    13 public void onCreate(Bundle savedInstanceState) {
    14 super.onCreate(savedInstanceState);
    15 setContentView(R.layout.main);
    16 SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
    17 surfaceHolder = surfaceView.getHolder();
    18 surfaceHolder.addCallback(this);
    19 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    20 }
    21 @Override
    22 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
    23 // TODO Auto-generated method stub
    24 }
    25 @Override
    26 public void surfaceCreated(SurfaceHolder arg0) {
    27 // TODO Auto-generated method stub
    28 camera = Camera.open();
    29
    30 Camera.Parameters parameters = camera.getParameters();
    31 parameters.setPreviewSize(480, 320); // 设置
    32 camera.setParameters(parameters);
    33 try {
    34 camera.setPreviewDisplay(surfaceHolder);
    35 } catch (IOException e) {
    36 System.out.println(e.getMessage());
    37 }
    38 camera.startPreview();
    39 }
    40 @Override
    41 public void surfaceDestroyed(SurfaceHolder arg0) {
    42 // TODO Auto-generated method stub
    43 if (camera != null) {
    44 camera.stopPreview();
    45 }
    46 camera.release();
    47 camera = null;
    48 }
    49 }

    其中的R.id.preview_view如下:

    1 <SurfaceView
    2 android:id="@+id/preview_view"
    3 android:layout_width="fill_parent"
    4 android:layout_height="fill_parent" />

        首先这个activity实现了SurfaceHolder.Callback接口,并重写了这个接口的三个方法。

        关于对surfaceHolder,surfaceView,SurfaceHolder.Callback的介绍,请看这里,很详细哦。

        http://www.cnblogs.com/bausch/archive/2011/10/20/2219068.html

        surfaceview总之能够获相机硬件捕捉到的数据并显示出来,在上面的代码中,先初始化了surfaceholder对象。并重写了surfaceCreated函数,在这个函数中,完成了对相机打开取景的基本操作。首先是Camera.open()获取一个Camera对象,在初始化一些camera参数,如图像格式,图像预览大小,刷新率等等。在设置预览显示,最后别忘了startPreview,则完成了取景。由于刚开始开发的工程需要将相机的取景设置为竖屏的,Barcode Scanner设置的是横屏的,开始再尝试调整图片显示方向时,我以为是再manifest中重新设置,

    1 android:screenOrientation="landscape"

          将landscape该为portrait,结果却很意外,屏幕是竖着显示了,但是取景后的内容与显示却是横竖相反的,手机竖着取景,显示的却是横着的。不可以简单的通过调整这个参数值来改变方向。后面调用下面这个函数,重新设置了预览照片的显示方向。

    1 camera.setDisplayOrientation(90);

         调整显示方向后,取景终于正常了。但是在后面预览拍照结果时,发现这都是假象,相机底层取景还是横屏的,只是在预览时进行了方向调整,这样还存在一个显示照片拉伸的问题。这个没有深入查看了。

         可以看这篇文章,Android Camera小结,写得比我的更全面,实用。

    http://www.diybl.com/course/3_program/java/android/20111201/563696.html 

         

  • 相关阅读:
    2019-06-09 学习日记 day30 JS
    2019-06-08 学习日记 day29 CSS
    2019-06-07 学习日记 day28 THML
    2019-06-06 Java学习日记 day27 反射
    2019-06-05 Java学习日记 day26 网络编程
    2019-06-04 Java学习日记 day25 多线程下
    Linux安装Nginx
    Linux安装MySQL
    Linux安装Redis
    Java Swing实战(五)表格组件JTable(1)
  • 原文地址:https://www.cnblogs.com/liuan/p/2317377.html
Copyright © 2011-2022 走看看