使用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);
就可以实现圆角的效果了。