android - 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);
}
}
解决方案
您可以在没有设置边距的情况下尝试这样的操作:
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 作为其父级。
推荐阅读
- google-chrome-extension - Chrome 扩展程序 - 取消发布
- windows - 如何使用 jsonpath 在 Windows Powershell 上的每一行上获取 k8s 集群节点名称一个名称?
- javascript - 如何将事件侦听器添加到 xmlhttp ajax 请求
- html - 如何导出招摇“试用”的 HTML 表单?
- c++ - 从中断调用的成员函数是否应该标记为易失性?
- r - 如何在 R 中使用 jsonlite 读取这个 JSON 文件?
- unity3d - 指定图层时,Physics2D.OverlapCircleAll 不返回明确的碰撞
- javascript - 当 Javascript 中的 API 链接错误时,如何防止 404 错误出现在控制台中?
- html - 复选框未显示在预期位置
- html - 悬停时如何删除按钮上的禁用图标?