我有一个SurfaceView
用于绘制图像的,我想将它们叠加到手机相机的实时信息中.
目前,SurfaceView
包含图像的图像具有白色背景,但如果我将它们叠加到手机的相机源上,则它们必须是透明的.相机和动画绘图不能在同一个上完成SurfaceView
.
追求使用涉及管理相机和绘制图像的多个视图的最佳方法是什么?是否可以SurfaceView
透明化?
我对OpenCV的Android相机示例代码感到困惑.他们创建了一个自定义类,它SurfaceHolder.Callback
在方法中实现并放入以下行surfaceChanged
:
mCamera.setPreviewDisplay(null);
Run Code Online (Sandbox Code Playgroud)
Android文档setPreviewDisplay
解释如下:
必须在startPreview()之前调用此方法.一个例外是,如果在调用startPreview()之前未设置预览表面(或设置为null),则可以使用非null参数调用此方法一次以设置预览表面.(这允许相机设置和曲面创建并行发生,节省时间.)预览曲面在预览运行时可能不会改变.
不同寻常的是,OpenCV的代码永远不会setPreviewDisplay
使用非null的SurfaceHolder调用.它工作正常,但改变图像的旋转使用setDisplayOrientation
不起作用.这条线似乎也没有做任何事情,因为没有它我会得到相同的结果.
如果我setPreviewDisplay
使用提供的SurfaceHolder来surfaceChanged
代替null
,则图像会旋转,但不包括图像处理的结果.我以后也会IllegalArgumentException
打电话给我lockCanvas
.
这是怎么回事?
以下是其代码中(可能)最相关的部分,略微简化并使用内联方法.这是完整版.
类定义
public abstract class SampleViewBase extends SurfaceView
implements SurfaceHolder.Callback, Runnable {
Run Code Online (Sandbox Code Playgroud)
打开相机时
mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
synchronized (SampleViewBase.this) {
System.arraycopy(data, 0, mFrame, 0, data.length);
SampleViewBase.this.notify();
}
camera.addCallbackBuffer(mBuffer);
}
});
Run Code Online (Sandbox Code Playgroud)
当表面发生变化时
/* Now allocate the buffer */
mBuffer = new byte[size];
/* The buffer where …
Run Code Online (Sandbox Code Playgroud) 我想在zxing捕捉屏幕(相机屏幕)周围放置自定义边框.我需要做些什么修改?我需要更改哪些活动和布局才能产生这种效果?
我只是想在android中的视频播放器(同时视频播放)上手动绘制圆形,矩形或其他东西.是否可能?如果任何代码示例要好得多.
谢谢.
我使用的是SurfaceView
具有SurfaceHolder
与在我的测试应用程序相机预览开始.
public class TextLocatorActivity extends Activity {
private Preview pvw;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
pvw = new Preview(this);
setContentView(pvw);
}
Run Code Online (Sandbox Code Playgroud)
我想使用CameraPreview(随SDK版本7的SDK Samples一起提供).点击UI即可拍照.这是Preview
班级:
public class Preview extends SurfaceView implements OnClickListener, SurfaceHolder.Callback {
SurfaceHolder holder;
Camera cam;
final static String TAG = "TextLocator:Preview";
Preview(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
this.setOnClickListener(this);
// seems to be required (although the docs state, this enum is deprecated, as the type will be …
Run Code Online (Sandbox Code Playgroud) 我有一个用于绘制图像的SurfaceView,我想将它们叠加到手机相机的实时信息中.我已经在相机预览surfaceview上阅读了Overlay图像, 以及如何在android上的相机使用的surfaceview上绘制叠加层
public class TestCameraOverlayActivity extends Activity {
Bitmap bitmap;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
Preview mPreview = new Preview(this);
DrawOnTop mDraw = new DrawOnTop(this);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
setContentView(mPreview);
addContentView(mDraw, new LayoutParams (LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
}
class DrawOnTop extends View {
public DrawOnTop(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
canvas.drawText("Test Text", 10, 10, …
Run Code Online (Sandbox Code Playgroud) 我创建了一个自定义的SurfaceView,用于绘制形状,用户可以缩放和平移视图以与形状进行交互。这一切的伟大工程,但现在的问题是,形状将总是在顶部绘制一切都在我的屏幕上,还对如按钮和textviews其他视图顶部。我尝试过以不同的方式在XML布局中对自定义视图和按钮进行排序,并尝试将视图作为FrameLayouts和RelativeLayouts的父项(如此处建议)。
我希望按钮和其他布局元素浮在我的自定义视图之上。如下图所示,当我平移视图时,矩形将遮盖按钮。
如何防止自定义SurfaceView绘制在所有内容之上?
我的绘图代码在SurfaceView类的单独线程中运行:
public class CustomShapeView extends SurfaceView implements Runnable, SurfaceHolder.Callback {
/* Other implementation stuff */
@Override
public void run() {
while (isDrawing) {
if (!holder.getSurface().isValid())
continue; //wait till it becomes valid
Canvas canvas = null;
try {
canvas = holder.lockCanvas(null);
synchronized (holder) {
try {
lock.lock();
canvas.concat(sampleMatrix);
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
drawShapes(canvas);
} finally {
lock.unlock();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
} …
Run Code Online (Sandbox Code Playgroud)