Android之圆形SurfaceView

使用ViewOutlineProvider来实现,ViewOutlineProvider专门用于阴影投射和剪切。

相关方法:

1. setOutlineProvider()

生成定义其投射阴影形状的轮廓,并且启用轮廓裁剪。

2. setClipToOutline()

设置是否应使用视图轮廓来剪切视图的内容

定义一个圆形的ViewOutlineProvider:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

    public static class CircleViewOutlineProvider extends ViewOutlineProvider {

        public CircleViewOutlineProvider() {

        }

        @Override

        public void getOutline(View view, Outline outline) {

            //864,648  横屏情况下,宽>高

            Log.d("Circle===","width:"+view.getWidth()+"==height:"+view.getHeight());

            //裁剪成一个圆形

            int left0 = (view.getWidth() - view.getHeight()) / 2;

            int top0 = 0;

            int right0 = left0 + view.getHeight() ;

            int bottom0 =  view.getHeight() ;

            outline.setOval(left0, top0, right0, bottom0);

        }

    }

设置到SurfaceView上:

surfaceView.setOutlineProvider(new CircleViewOutlineProvider(dp1));

surfaceView.setClipToOutline(true);

这样就可以实现圆形预览形状的SurfaceView了。

延伸,设置圆角的方式:

public class TextureVideoViewOutlineProviderextends ViewOutlineProvider {

    private float mRadius;

    public TextureVideoViewOutlineProvider(float radius) {

        this.mRadius = radius;

    }

    @Override

    public void getOutline(View view, Outline outline) {

        Rect rect =new Rect();

        view.getGlobalVisibleRect(rect);

        int leftMargin =0;

        int topMargin =0;

        Rect selfRect =new Rect(leftMargin, topMargin,

                rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin);

        outline.setRoundRect(selfRect, mRadius);

    }

}

然后设置:

surfaceView.setOutlineProvider(new TextureVideoViewOutlineProvider(10));

surfaceView.setClipToOutline(true);

就可以实现圆角的效果了。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android中实现圆形预览人脸,可以使用以下步骤: 1. 首先,创建一个自定义的SurfaceView类,用于展示相机预览。在这个类的构造函数中,设置SurfaceHolder.Callback回调函数,以便在预览界面创建、销毁或改变时进行处理。 2. 在SurfaceHolder.Callback回调函数中,使用Camera.open()方法打开相机,并设置相机参数,包括预览尺寸、预览格式等。然后,使用Camera.setPreviewDisplay()方法将相机预览设置为SurfaceView。 3. 接下来,在SurfaceView的onDraw()方法中,绘制圆形的预览框。可以使用Canvas.drawCircle()方法绘制圆形。 4. 最后,在Camera.PreviewCallback回调函数中,获取每一帧的预览数据,并使用BitmapFactory.decodeByteArray()方法将其转换成Bitmap对象。然后,使用Canvas.drawBitmap()方法将Bitmap对象绘制到圆形的预览框中。 需要注意的是,在绘制圆形的预览框时,可以使用PorterDuff.Mode.SRC_IN模式来实现圆形裁剪。具体实现可以参考以下代码: ``` @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制圆形预览框 Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.FILL); canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); // 绘制预览图像 if (mBitmap != null) { canvas.drawBitmap(mBitmap, null, new RectF(0, 0, getWidth(), getHeight()), paint); } } @Override public void onPreviewFrame(byte[] data, Camera camera) { Camera.Size size = camera.getParameters().getPreviewSize(); YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); ByteArrayOutputStream out = new ByteArrayOutputStream(); Rect rect = new Rect(0, 0, size.width, size.height); image.compressToJpeg(rect, 100, out); byte[] jpegData = out.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length); mBitmap = Bitmap.createScaledBitmap(bitmap, getWidth(), getHeight(), true); invalidate(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值