一、概述

为实现Camera正方形预览,本Demo使用GLSurfaceView显示Camera预览数据,本文也主要针对GLSurfaceView的使用做介绍。

Android中的视图有View、SurfaceView、GLSurfaceView、TextureView等,它们各有不同。主要的特点如下:

View:

显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;

必须在UI主线程内更新画面,速度较慢。

SurfaceView:

从Android 1.0(API level 1)时就有 。它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。

基于View视图进行拓展的视图类,更适合2D游戏的开发;

是View的子类,采用双缓机制,在新的线程中更新画面,所以刷新界面速度比View快,而且不影响主线程对事件的相应;

缺点是不能做变形和动作,也不能随屏幕的变化而变化,也不能在起上面覆盖其他的SurfaceView,导致无法实现滤镜等功能。

GLSurfaceView:

从Android1.5(API level 3)开始加入,作为SurfaceView的补充。 在SurfaceView的基础上,加入了OpenGL ES的管理,并自带了Render渲染线程。

专用于3D游侠开发,适合OpenGL ES专用。

TextureView:

在4.0(API level 14)中引入。它可以将内容流直接投影到View中,可以用于实现Live preview等功能。继承自View,只能运行在硬件加速窗口。

类似于SurfaceView + SurfaceTexture,内部包含一个SurfaceTexture,可以让Camera 的数据和显示分离。 比如需要做二次处理时,如Camera把采集的数据发送给SurfaceTexture(滤镜、美颜),SurfaceTexture处理后传给TextureView显示,TextureView可以做View的变形和动画。

数据处理一般是在主线程上面做。

二、GLSurfaceView使用

1、 创建GLSurfaceView实例,展示数据

@1.1 实例化GLSurfaceView

@1.2 实例化Camera

@1.3 绑定Camera和GLSurfaceView,用于数据显示

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// @1.1 创建GLSurfaceView

mGLSurfaceView = new SquareGLSurfaceView(this);

DisplayMetrics dm = new DisplayMetrics();

mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;

// @1.2 实例化Camera,后面绑定到GLSurfaceView上面,用于显示数据

mCamera = new SquareCamera(this);

if (!mCamera.openCamera(dm.widthPixels, dm.heightPixels, mCameraId)) {

return;

}

// @1.3 绑定Camera和GLSurfaceView,用于数据显示

mGLSurfaceView.initGLSView(mCamera, false);

setContentView(mGLSurfaceView);

}

1.1 实例化GLSurfaceView

public class SquareGLSurfaceView extends GLSurfaceView {

private static final String TAG = "CameraV1GLSurfaceView";

private SquareRenderer mRenderer;

private int textureId = -1;

public SquareGLSurfaceView(Context context) {

super(context);

}

1.2 实例化Camera

主要是在SquareCamera 中完成的,返回一个Camera实例就好

这个类中,还要定义一些Camera的基本操作,例如startPreView()、stopPreview()等等

import android.app.Activity;

import android.graphics.SurfaceTexture;

import android.hardware.Camera;

import android.util.Log;

import android.view.Surface;

import java.io.IOException;

/** * Created by GHC on 2017/6/27. */

public class SquareCamera {

private Activity mActivity;

private int mCameraId;

private Camera mCamera;

public SquareCamera(Activity activity) {

mActivity = activity;

}

// 打开Camera,需要设置Camera的参数,例如预览大小、拍照大小等等。

public boolean openCamera(int screenWidth, int screenHeight, int cameraId) {

try {

mCameraId = cameraId;

mCamera = Camera.open(mCameraId);

Camera.Parameters parameters = mCamera.getParameters();

parameters.setPreviewSize(1280, 720);

setCameraDisplayOrientation(mActivity, mCameraId, mCamera);

mCamera.setParameters(parameters);

} catch (Exception e) {

e.printStackTrace();

return false;

}

return true;

}

public static void setCameraDisplayOrientation(Activity activity,

int cameraId, Camera camera) {

Camera.CameraInfo info =

new Camera.CameraInfo();

Camera.getCameraInfo(cameraId, info);

int rotation = activity.getWindowManager().getDefaultDisplay()

.getRotation();

int degrees = 0;

switch (rotation) {

case Surface.ROTATION_0: degrees = 0; break;

case Surface.ROTATION_90: degrees = 90; break;

case Surface.ROTATION_180: degrees = 180; break;

case Surface.ROTATION_270: degrees = 270; break;

}

int result;

if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {

result = (info.orientation + degrees) % 360;

result = (360 - result) % 360; // compensate the mirror

} else { // back-facing

result = (info.orientation - degrees + 360) % 360;

}

camera.setDisplayOrientation(result);

}

public void startPreview() {

if (mCamera != null) {

mCamera.startPreview();

}

}

public void stopPreview() {

if (mCamera != null) {

mCamera.stopPreview();

}

}

public void setPreviewTexture(SurfaceTexture surfaceTexture) {

if (mCamera != null) {

try {

mCamera.setPreviewTexture(surfaceTexture);

} catch (IOException e) {

e.printStackTrace();

}

}

}

public void releaseCamera() {

if (mCamera != null) {

mCamera.release();

mCamera = null;

}

}

}

1.3 绑定Camera和GLSurfaceView,用于数据显示

@1.1.1 设置OpenGl ES版本号

@1.1.2 创建Render渲染器

public void initGLSView(SquareCamera camera, boolean isPreviewStarted) {

WindowManager wm = (WindowManager) getContext()

.getSystemService(Context.WINDOW_SERVICE);

int width = wm.getDefaultDisplay().getWidth();

Log.d(TAG, "[initGLSView] >> width:" + width);

//@1.1.1 设置OpenGl ES版本,一般设置为2,适配性比较好

setEGLContextClientVersion(2);

//@1.1.2 设置GLSurfaceView使用的Render渲染器

mRenderer = new SquareRenderer();

mRenderer.init(this, camera, isPreviewStarted, width);

setRenderer(mRenderer);

}

2、Render渲染器的使用

GLSurfaceView创建成功后,就可以在Camera上面查看显示的数据了

之前说过,GLSurfaceView通过子线程来更新画面,其实就是Render渲染线程

2.1 Override方法复写

继承GLSurfaceView.Renderer后,需要复写一下三个方法:

onSurfaceCreated(GL10 gl, EGLConfig config) onSurfaceChanged(GL10 gl, int width, int height) onDrawFrame(GL10 gl)

Android屏幕计算正方形,Android Camera 正方形预览(二)相关推荐

  1. Android开发实践:掌握Camera的预览方向和拍照方向

    Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题. 图像的Sensor方向:手机Camera的图像数据都是来自于摄 ...

  2. android yuv加水印_Android Camera添加预览水印

    前言 在SurfaceView初步以及Camera初步中我介绍了如何使用SurfaceView以及如何使用SurfaceView来预览Camera画面,接下来我就来介绍下如何给Camera添加水印效果 ...

  3. Android编程中调用Camera时预览画面有旋转问题的解决方法

    本文实例讲述了Android编程中调用Camera时预览画面有旋转问题的解决方法.分享给大家供大家参考,具体如下: 在调用Camera写应用的时候,前后摄像头的情况有时候是不一样的.有时候,明明后摄像 ...

  4. Android 短视频编辑开发之摄像头预览实时美颜(三)

    前言: 在上一篇文章中给小伙伴们介绍了进行Camera预览,如果你还没有看过的话,建议先去看上一篇文章<Android 短视频开发之摄像头预览(二> 本篇文章会介绍如何实现摄像头预览画面实 ...

  5. Android 音视频开发(三) -- Camera2 实现预览、拍照功能

    音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...

  6. Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决

    Android 8.0 WebView 拍照.简易预览.二维码扫描 各种问题解决 项目用到了WebView包装HTML5做成app使用,其中有页面用到了二维码和拍照上传功能.本人从未做过android ...

  7. android 屏幕适配框架,Android屏幕适配

    为什么要进行Android屏幕适配 由于Android系统的开放性,任何用户.开发者.OEM厂商.运营商都可以对Android进行定制,于是导致: 1.Android系统碎片化:小米定制的MIUI.魅 ...

  8. Android 9.0 三方app whatsapp 拍照预览模糊

    之前在进行项目开发时,有碰到 Android 9.0 三方app whatsapp 拍照预览分辨率过低 现象,但是拍照出来的照片是清晰的, 查看log发现priview-size过低导致预览模糊,而p ...

  9. Android Camera相机预览,拍照 ,横屏竖屏的处理

    功能分别是: 1.竖屏的前置,后置显示 加 拍照 2.横屏的前置,后置显示 加 拍照 整个项目的代码贴出来了,里面加了有备注,不理解的也可以去参考官网点击跳转到官网 首先选择前置后置布局效果如下 布局 ...

最新文章

  1. OpenStack快速入门
  2. python_web框架
  3. python whl大全
  4. 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型 1
  5. 打造一个属于自己的应用服务自动监控警报程序
  6. 微软Vista今起大幅降价 最高幅度达到千元
  7. 鸿蒙微内核游戏,华为鸿蒙微内核
  8. before css 旋转_CSS及购物车的制作练习
  9. 2018ACM-ICPC南京赛区网络赛: B. The writing on the wall
  10. 求最长XX序列的两种方法
  11. Hbuilder:实现阴影透明背景特效
  12. psd缩略图上传组件
  13. IDEA 思维导图 ,类UML 图工具插件 plantUML integration
  14. 安卓开发调用python脚本_android开发调用python脚本
  15. hdu4565 so easy 矩阵
  16. 魔兽世界怀旧服服务器显示地图,魔兽世界怀旧服:1-60级地图任务路线大全,快来拿走收藏!部落篇...
  17. VSCode更改默认浏览器
  18. PHPExcel出现 Formula Error的解决方案
  19. html中怎样写渐变色代码,如何用CSS写渐变色
  20. AS 导出aar给Unity出打包出现Unable to merge android manifests

热门文章

  1. 最小权顶点覆盖问题分析
  2. 深度学习《Life-Long Learning》
  3. java实现对properties类型文件的读写
  4. 去哪儿-07-city-router
  5. [解决方案]ln:无法创建符号链接‘ /usr/bin/python‘:权限不够
  6. Linux环境下使用NLPIR(ICTCLAS)中文分词详解
  7. SUMIFS函数多条件求和的9个实例【转载】
  8. MySQL之Procedure(存储过程)和Function(函数)
  9. C—蓝彗星(差分问题)
  10. 正面管教php_佛山市第三中学正面管教家长工作坊PHP分享会