在相机预览中不工作 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的主要内容,如果未能解决你的问题,请参考以下文章