Anroid TextureView、SurfaceView的Camera预览实现

本文对比了TextureView与SurfaceView在Android应用中用于Camera预览的功能实现。TextureView自Android 4.0引入,解决了SurfaceView无法融入UI及设置透明度等问题。通过示例代码展示了如何使用TextureView和SurfaceView进行Camera预览,并调整预览尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实TextureView是在Android4.0以后才有的,为了弥补SurfaceView的不足,即不能够融入到整个UI中,也不能设置一些属性,如设置透明度等等,废话不多说,上代码:

TextureView实现Camera的预览


package com.creditease.runningman;

import android.app.Activity;
import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.TextureView;
import android.view.WindowManager;
import android.widget.FrameLayout;

import java.io.IOException;

/**
 * Created by guibaozou on 2016/11/3.
 */

public class TextureActivity extends Activity implements TextureView.SurfaceTextureListener{

    private TextureView textureView;
    private Camera camera;
    private static final String TAG = "TextureActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
	//此行代码必须存在,是TextureView必要在窗口加速中才能使用
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
        textureView = new TextureView(this);
        textureView.setSurfaceTextureListener(this);
        textureView.setBackgroundColor(getResources().getColor(android.R.color.black));
        setContentView(textureView);

    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        camera = Camera.open(1);
        try {
            camera.setPreviewTexture(surface);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Camera.Parameters parameters = camera.getParameters();
        Camera.Size previewSize = parameters.getPreviewSize();
//        parameters.setPreviewSize(mScreenWidth,mScreenHeight);
//        parameters.setPictureFormat(ImageFormat.NV21);
//        camera.setParameters(parameters);
        textureView.setLayoutParams(new FrameLayout.LayoutParams(previewSize.width,previewSize.height,Gravity.CENTER));
        camera.setPreviewCallback(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                //在视频聊天中,这里传送本地frame数据给remote                Log.e(TAG, "camera:"+camera);
                Log.e(TAG, "byte:"+data);
            }
        });
        camera.startPreview();
	//设置窗口透明度
        textureView.setAlpha(0.5f);
	//此行代码让其预览画面为竖直的画面
textureView.setRotation(90.0f); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { camera.stopPreview(); camera.release(); return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { }}



SurfaceView预览Camera实现
package com.creditease.runningman;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;


/**
 * Created by guibaozou on 2016/11/3.
 */

public class SurfaceActivity extends Activity implements SurfaceHolder.Callback {

    private static final String TAG = "SurfaceActivity";
    private Camera mCamera;
    private SurfaceView surfaceView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        surfaceView = new SurfaceView(this);
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().addCallback(this);
        setContentView(surfaceView);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open(1);
	//此行代码让其预览画面为竖直的画面
        mCamera.setDisplayOrientation(90);
        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        Camera.Parameters parameters = mCamera.getParameters();
        Camera.Size previewSize = parameters.getPreviewSize();
        parameters.setPreviewSize(previewSize.width,previewSize.height);
        surfaceView.getHolder().setFixedSize(previewSize.width,previewSize.height);

        /* 每秒从摄像头捕获5帧画面, */
//        parameters.setPreviewFrameRate(5);
        /* 设置照片的输出格式:jpg */
        parameters.setPictureFormat(ImageFormat.NV21);
        /* 照片质量 */
//        parameters.set("jpeg-quality", 85);

        parameters.setPictureSize(previewSize.width,previewSize.height);



        mCamera.setPreviewCallback(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                //在视频聊天中,这里传送本地frame数据给remote                Log.e(TAG, "camera:"+camera);
                Log.e(TAG, "byte:"+data);

                Camera.Size size = camera.getParameters().getPreviewSize();
                YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
                Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
            }
        });
        mCamera.setParameters(parameters);
        mCamera.startPreview();

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.setPreviewCallback(null);
        mCamera.release();
    }
}


若有不足,欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值