我想将相机预览显示在圆形表面上(类似于舷窗视图)。我还需要预览周围的区域为空(透明),所以我相信屏蔽不会有帮助。
我尝试创建一个可绘制的形状,然后将其设置为SurfaceView的背景,但它不起作用。
任何想法是否可以完成以及如何做?
答案 0 :(得分:2)
如果您结帐SurfaceView,draw
和dispatchDraw
(从第344行开始),请创建一个方形"舷窗"显示内容。您可以做的是创建一个扩展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);
答案 1 :(得分:1)
我是通过扩展表面视图并覆盖它来实现的:
@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);
}