Android TextureView设置不规则圆角

941 阅读1分钟

产品想要的效果如下图所示:

image.png

这是一个左侧圆角,右侧直角的播放器视图。 由于TextureView继承自View,所以可以使用设置View通用的ViewOutlineProvider来实现圆角,如下所示:

mTextureView.setOutlineProvider(new TextureViewOutlineProvider(DisplayUtil.dp2px(20));
mTextureView.setClipToOutline(true);

自定义的ViewOutlineProvider如下:

public class TextureViewOutlineProvider extends ViewOutlineProvider {
    private int raduis;

    public TextureVideoViewOutlineProvider(int radius) {
        this.raduis = radius;
    }

    @Override
    public void getOutline(View view, Outline outline) {
        Rect rect = new Rect();
        view.getGlobalVisibleRect(rect);
        Rect selfRect = new Rect(0, 0,
                rect.right - rect.left,
                rect.bottom - rect.top);
        outline.setRoundRect(selfRect, raduis);
    }
}

或者:

  @Override
  public void getOutline(View view, Outline outline) {
       outline.setRoundRect(0,0,view.getWidth(),
           view.getHeight(),radius);
  }

但是这样获取到的是一个四周都是圆角的TextureView,如下所示:

image.png

这里要实现产品想要的只有左侧才有圆角,右侧直角的TextureView。

这里奇特的处理就是:将RoundRect的宽度增加了radius的长度(这样其实还是生成的是4个圆角,但是因为整个Rect的宽度变长了,但是TextureView的宽度还是不变,所以相当于这个Rect的宽度铺长了,右侧的radius就被隐藏了,所以就得到了上面的左侧圆角,右侧直角的Textureview)。

如下所示:

 @Override
 public void getOutline(View view, Outline outline) {
       outline.setRoundRect(0,0,view.getWidth()+radius,
           view.getHeight(),radius);
 }

或者:

   @Override
    public void getOutline(View view, Outline outline) {
        Rect rect = new Rect();
        view.getGlobalVisibleRect(rect);
        Rect selfRect = new Rect(0, 0,
                rect.right - rect.left + radius,
                rect.bottom - rect.top);
        outline.setRoundRect(selfRect, raduis);
    }

现在得到的就是左侧圆角,右侧圆角被隐去的TextureView: image.png