Android屏幕计算正方形,Android Camera 正方形预览(二)
一、概述
为实现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 正方形预览(二)相关推荐
- Android开发实践:掌握Camera的预览方向和拍照方向
Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题. 图像的Sensor方向:手机Camera的图像数据都是来自于摄 ...
- android yuv加水印_Android Camera添加预览水印
前言 在SurfaceView初步以及Camera初步中我介绍了如何使用SurfaceView以及如何使用SurfaceView来预览Camera画面,接下来我就来介绍下如何给Camera添加水印效果 ...
- Android编程中调用Camera时预览画面有旋转问题的解决方法
本文实例讲述了Android编程中调用Camera时预览画面有旋转问题的解决方法.分享给大家供大家参考,具体如下: 在调用Camera写应用的时候,前后摄像头的情况有时候是不一样的.有时候,明明后摄像 ...
- Android 短视频编辑开发之摄像头预览实时美颜(三)
前言: 在上一篇文章中给小伙伴们介绍了进行Camera预览,如果你还没有看过的话,建议先去看上一篇文章<Android 短视频开发之摄像头预览(二> 本篇文章会介绍如何实现摄像头预览画面实 ...
- Android 音视频开发(三) -- Camera2 实现预览、拍照功能
音视频 系列文章 Android 音视频开发(一) – 使用AudioRecord 录制PCM(录音):AudioTrack播放音频 Android 音视频开发(二) – Camera1 实现预览.拍 ...
- Android 8.0学习 (36)---Android 8.0 WebView 拍照、简易预览、二维码扫描 各种问题解决
Android 8.0 WebView 拍照.简易预览.二维码扫描 各种问题解决 项目用到了WebView包装HTML5做成app使用,其中有页面用到了二维码和拍照上传功能.本人从未做过android ...
- android 屏幕适配框架,Android屏幕适配
为什么要进行Android屏幕适配 由于Android系统的开放性,任何用户.开发者.OEM厂商.运营商都可以对Android进行定制,于是导致: 1.Android系统碎片化:小米定制的MIUI.魅 ...
- Android 9.0 三方app whatsapp 拍照预览模糊
之前在进行项目开发时,有碰到 Android 9.0 三方app whatsapp 拍照预览分辨率过低 现象,但是拍照出来的照片是清晰的, 查看log发现priview-size过低导致预览模糊,而p ...
- Android Camera相机预览,拍照 ,横屏竖屏的处理
功能分别是: 1.竖屏的前置,后置显示 加 拍照 2.横屏的前置,后置显示 加 拍照 整个项目的代码贴出来了,里面加了有备注,不理解的也可以去参考官网点击跳转到官网 首先选择前置后置布局效果如下 布局 ...
最新文章
- OpenStack快速入门
- python_web框架
- python whl大全
- 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型 1
- 打造一个属于自己的应用服务自动监控警报程序
- 微软Vista今起大幅降价 最高幅度达到千元
- 鸿蒙微内核游戏,华为鸿蒙微内核
- before css 旋转_CSS及购物车的制作练习
- 2018ACM-ICPC南京赛区网络赛: B. The writing on the wall
- 求最长XX序列的两种方法
- Hbuilder:实现阴影透明背景特效
- psd缩略图上传组件
- IDEA 思维导图 ,类UML 图工具插件 plantUML integration
- 安卓开发调用python脚本_android开发调用python脚本
- hdu4565 so easy 矩阵
- 魔兽世界怀旧服服务器显示地图,魔兽世界怀旧服:1-60级地图任务路线大全,快来拿走收藏!部落篇...
- VSCode更改默认浏览器
- PHPExcel出现 Formula Error的解决方案
- html中怎样写渐变色代码,如何用CSS写渐变色
- AS 导出aar给Unity出打包出现Unable to merge android manifests
热门文章
- 最小权顶点覆盖问题分析
- 深度学习《Life-Long Learning》
- java实现对properties类型文件的读写
- 去哪儿-07-city-router
- [解决方案]ln:无法创建符号链接‘ /usr/bin/python‘:权限不够
- Linux环境下使用NLPIR(ICTCLAS)中文分词详解
- SUMIFS函数多条件求和的9个实例【转载】
- MySQL之Procedure(存储过程)和Function(函数)
- C—蓝彗星(差分问题)
- 正面管教php_佛山市第三中学正面管教家长工作坊PHP分享会