我想将相机预览显示在圆形表面上(类似于舷窗视图)。我还需要预览的区域是空的(透明),所以我相信掩盖不会有帮助。
我已经尝试创建可绘制的形状,然后将其设置为SurfaceView的背景,但不起作用。
有什么想法是否可以做到?
如果您查看SurfaceView,draw
和dispatchDraw
(从第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);
}