在圆形表面上显示相机预览(舷窗效果)

时间:2014-03-07 21:42:09

标签: android

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

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

任何想法是否可以完成以及如何做?

2 个答案:

答案 0 :(得分:2)

如果您结帐SurfaceViewdrawdispatchDraw(从第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);
}