ViewOutlineProvider 轮廓裁剪(5.0以上特性)

ViewOutlineProvider 轮廓裁剪(5.0 以上特性)

需求: 需要把相机预览SurfaceView裁剪成圆形,ViewOutlineProvider 很好的实现了这个效果

关于ViewOutlineProvider

ViewOutlineProvider是抽象类,View构建其{@link Outline}的接口,用于阴影投射和剪切。

View 相关的方法
setOutlineProvider()

设置View的{@link ViewOutlineProvider},生成定义其投射的阴影形状的轮廓(Outline),并启用轮廓剪裁。

默认的轮廓为ViewOutlineProvider中的BACKGROUND,通过{@link Drawable#getOutline(Outline)}从View的背景drawable中查询轮廓(Outline).

如果ViewOutlineProvider为null,如果查询轮廓返回false,或者如果生成的Outline为空{@link Outline#isEmpty()},则不会投射阴影

只有Outline#canClip()返回true的轮廓才可用于裁剪

setClipToOutline()

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

note: 如果View的Outline从{@link Outline#canClip()}返回true,则只会遵循此标志

代码

圆形:

surfaceView.setOutlineProvider(new CircleViewOutlineProvider(dp1));
surfaceView.setClipToOutline(true);

@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 外嵌套FrameLayout,通过设置FrameLayout的ViewOutlineProvider 来达到目的,代码类似

圆角矩形:

	@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public static class RoundViewOutlineProvider extends ViewOutlineProvider {
        private float mRadius;
        public RoundViewOutlineProvider(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(0, 0, view.width, view.height, mRadius)
			outline.setRoundRect(selfRect, mRadius);
        }
    }
	

引用:

Android5.x新特性之ViewOutlineProvider轮廓、阴影—setClipToOutline裁剪

https://www.cnblogs.com/summerpxy/p/4962761.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值