在圆形表面上显示摄像头预览(舷窗效果)



我想将相机预览显示在圆形表面上(类似于舷窗视图)。我还需要预览的区域是空的(透明),所以我相信掩盖不会有帮助。

我已经尝试创建可绘制的形状,然后将其设置为SurfaceView的背景,但不起作用。

有什么想法是否可以做到?

如果您查看SurfaceView,drawdispatchDraw(从第344行开始)制作一个正方形的" Porthole"以显示内容。您可以做的是将 SurfaceView扩展并以其方式覆盖这些类,而是使用圆形路径覆盖它们:

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawPath(circ, paint);

circ是作为Path创建的。例如:

Path circ = new Path();
circ.addCircle(canvas.getWidth() / 2, canvas.getWidth() / 2, canvas.getWidth() / 2, Path.Direction.CW);

另外,您需要确保将Z订单设置为顶部:

this.setZOrderOnTop(true);

我通过扩展表面视图和覆盖来实现它:

@Override
protected void dispatchDraw(Canvas canvas) {
    clipPath = new Path();
    //TODO: define the circle you actually want
    clipPath.addCircle((float) dpToPx(100), (float) dpToPx(100), (float) dpToPx(100), Path.Direction.CW);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.clipPath(clipPath);
    canvas.drawPath(clipPath, paint);
   this.setZOrderOnTop(true);
    super.dispatchDraw(canvas);
}

最新更新