在相机预览中不工作 setAlpha

Posted

技术标签:

【中文标题】在相机预览中不工作 setAlpha【英文标题】:Not working setAlpha in camera preview 【发布时间】:2016-01-20 09:07:46 【问题描述】:

我想在 android 系统上创建相机预览。我也想让它在 50% 中透明。这就是问题所在。 setAlpha 在我使用时对我不起作用。

这是我的服务,我用来将 SurfaceView 添加到窗口:

WindowManager.LayoutParams tmp = new WindowManager.LayoutParams(
            measuredWidth,measuredHeight,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSPARENT);
    /*s.setZOrderOnTop(true);
    s.setAlpha(0.5f);
    tmp.alpha=0.0f;

    wm.addView(s, tmp);*/

    LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View mCameraView = layoutInflater.inflate(R.layout.camera_surface, null);
    StunGunPreview preview=(StunGunPreview) mCameraView.findViewById(R.id.textureView);
    wm.addView(mCameraView, tmp);



public class StunGunPreview extends SurfaceView implements
        SurfaceHolder.Callback 
    SurfaceHolder holder;
    static Camera mCamera;
    Context c;
    WindowManager wm;

    public StunGunPreview(Context context, AttributeSet attrs) 
        super(context,attrs);
        c = context;
        wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        holder = this.getHolder();
        holder.addCallback(this);
        holder.setFormat(PixelFormat.TRANSPARENT);
       setZOrderOnTop(true);
    

    @Override
    public void surfaceCreated(SurfaceHolder holder) 

        start_camera();
    

    private void start_camera() 
        try 
            mCamera = Camera.open();
         catch (RuntimeException e) 
            return;
        
        try 
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
         catch (Exception e) 
            return;
        
    

【问题讨论】:

【参考方案1】:

SurfaceView 有两部分,Surface 和 View。调用 View 的 setAlpha() 方法只会影响在 View 上绘制的内容,这对您没有帮助,因为正在将 Camera 帧发送到 Surface。

Surface 是一个独立的层。当前的 API 不提供设置“平面 alpha”的方法,因此您只需获取像素值所具有的任何内容。对于相机和视频输出,YUV 到 RGB 的转换总是会生成完全不透明的像素。

要做你想做的事,你需要将相机预览发送到 SurfaceTexture,它将帧转换为 OpenGL ES“外部”纹理。然后,您可以将其渲染到部分透明的四边形上。这是一项相当多的工作,但是一旦你让它工作,你就可以用实时相机图像做任何事情(比如将它包裹在一个球体上或让它在屏幕上弹跳)。

可以在Grafika 中的“来自相机的纹理”活动中找到一个简单的示例。

【讨论】:

以上是关于在相机预览中不工作 setAlpha的主要内容,如果未能解决你的问题,请参考以下文章

iPhone相机,如何避免相机在预览视图上叠加;如何知道何时进入预览视图?

片段中的 Android 相机预览

Android 相机将无法工作。开始预览失败

相机预览人像设置参数失败

Android 相机预览帧时间戳

Android相机预览设置适配及显示方式