首页 > 解决方案 > Android 如何使用 ViewOutlineProvider 显示圆形阴影?

问题描述

我正在创建一个自定义视图,我想使用 API 21+ 中支持的 ViewOutlineProvider 为其显示圆形阴影。在为轮廓设置roundRect时。我总是得到如下阴影效果,矩形以某种方式转换为多边形。

带阴影的自定义视图

带阴影的自定义视图

我的 ViewOutlineProvider 看起来像这样

private class OutlineProvider extends ViewOutlineProvider {

    @Override
    public void getOutline(View view, Outline outline) {
        Rect rect = new Rect(0, 0, view.getWidth(), view.getHeight());
        outline.setRoundRect(rect, rect.width()/2f);
    }

}

标签: androidandroid-layoutandroid-custom-view

解决方案


您可以在没有设置边距的情况下尝试这样的操作:

setClipToOutline(true);
setOutlineProvider(new ViewOutlineProvider() {
    @Override
    public void getOutline(View view, Outline outline) {
        outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), cornerSize);
    }
});

否则:

setOutlineProvider(new ViewOutlineProvider() {
  @Override
  public void getOutline(View view, Outline outline) {
    Rect rect = new Rect();
    view.getGlobalVisibleRect(rect);
    ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
    int leftMargin = layoutParams.leftMargin;
    int topMargin = layoutParams.topMargin;
    rect.set(leftMargin, topMargin, rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin);
    outline.setRoundRect(rect, ...);
    view.setClipToOutline(true);
  }
});

并将此视图添加到 ViewGroup 作为其父级。


推荐阅读