• 2.1.2 预览Surface


       同样,在开始使用摄像头之前,还需要创建某种类型的Surface(表面),使得Camera应用程序能够在其绘制取景器(viewfinder)或预览图像。Surface是Android中的一个抽象类,表示绘制图形或图像的位置。提供一个绘图Surface的最简单的方法就是使用SurfaceView类。SurfaceView是在标准视图中提供Surface的具体类。

     1  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="match_parent"
     4     android:orientation="vertical"
     5     >
     6    <SurfaceView 
     7     android:id="@+id/CameraView"
     8     android:layout_width="match_parent"
     9     android:layout_height="match_parent"
    10     />
    11  </LinearLayout>

      为了在代码中实现通过Camera此SurfaceView,需要添加一个SurfaceHolder类。SurfaceHolder类可以作为Surface上的一个监控器,并且通过回调提供接口,从而让我们知道什么时候创建、销毁或更改Surface。同时,SurfaceView类还提供了一个getHolder方法,用于获得一个对应其Surface的SurfaceHolder对象。

       以下代码片段。其访问在布局XML中声明的SurfaceView,并从中获得一个SurfaceHolder。同时,它还设置该Surface是一个“推送”类型的Surface,这意味着在Surface本身的外部维持绘图缓冲区。在这种情况下,该缓冲区有Camera类管理。“推送”类型的Surface是Camera预览所需的Surface。

    1         cameraView=(SurfaceView) findViewById(R.id.CameraView);
    2         surfaceHolder=cameraView.getHolder();
    3         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

       另外,我们可能希望在活动中实现SurfaceHolder.Callback,从而使得在创建、修改及销毁该Surface时活动将会获得通知。为了实现回调,需要添加一下方法。

     1     @Override
     2     public void surfaceCreated(SurfaceHolder holder) {
     3         
     4     }
     5 
     6     @Override
     7     public void surfaceChanged(SurfaceHolder holder, int format, int width,
     8             int height) {
     9         
    10     }
    11 
    12     @Override
    13     public void surfaceDestroyed(SurfaceHolder holder) {
    14         
    15     }

        最后,需要告诉SurfaceHolder使用该活动作为回调处理程序。

    1      surfaceHolder.addCallback(this);

       现在活动看起来如下所示:

     1 package com.nthm.androidtest;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.view.SurfaceHolder;
     6 import android.view.SurfaceView;
     7 
     8 public class SnapShot extends Activity implements SurfaceHolder.Callback {
     9     private SurfaceView cameraView;
    10     private SurfaceHolder surfaceHolder;
    11     
    12     @Override
    13     protected void onCreate(Bundle savedInstanceState) {
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.snapshot);
    16         cameraView=(SurfaceView) findViewById(R.id.CameraView);
    17         surfaceHolder=cameraView.getHolder();
    18         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    19         surfaceHolder.addCallback(this);
    20     }
    21 
    22     @Override
    23     public void surfaceCreated(SurfaceHolder holder) {
    24         
    25     }
    26 
    27     @Override
    28     public void surfaceChanged(SurfaceHolder holder, int format, int width,
    29             int height) {
    30         
    31     }
    32 
    33     @Override
    34     public void surfaceDestroyed(SurfaceHolder holder) {
    35         
    36     }
    37 }
  • 相关阅读:
    利用艺术家的整数ID映射将标签转换为向量
    TOMCATserver不写port号、不写项目名訪问项目、虚拟文件夹配置
    一、奇妙插件Tampermonkey的简单安装教程
    三层登录—c#
    MapReduce中combine、partition、shuffle的作用是什么
    代码混淆防止APP被反编译指南
    数据分析思路的套路攻略
    聊一聊数据分析师这个职业
    Android优化之内存优化倒计时篇
    如何实现360度的手游安全防护?网易云易盾专家分享最新实践
  • 原文地址:https://www.cnblogs.com/ZSS-Android/p/3926813.html
Copyright © 2020-2023  润新知