ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 在相机预览中不工作setAlpha

2019-06-23 15:11:44  阅读:156  来源: 互联网

标签:android surfaceview alpha android-camera


我想在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;
        }
    }
}

解决方法:

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

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

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

一个简单的例子可以在Grafika的“相机纹理”活动中找到.

标签:android,surfaceview,alpha,android-camera
来源: https://codeday.me/bug/20190623/1271858.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有