创建自定义凸路径Android

2024-02-06

我希望为我的框架布局设置一个自定义形状(矩形每个角的不同半径),以便框架布局中的视图将剪辑到形状的边界。

    ViewOutlineProvider provider = new ViewOutlineProvider() {
        @Override
        public void getOutline(View view, Outline outline) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                configurePath(getWidth(), getHeight());
                outline.setConvexPath(borderPath);
            }
        }
    };

    setOutlineProvider(provider);
    setClipToOutline(true);

And the configurePath()看起来像这样:

private void configurePath (int width, int height) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        return;
    }

    borderPath.rewind();

    float minSize = Math.min(width, height);
    float maxRadiusWidth = 2 * Math.max(Math.max(topLeftRadius, topRightRadius),
            Math.max(bottomLeftRadius, bottomRightRadius));

    if (minSize < maxRadiusWidth) {
        borderPath.addRect(0, 0, width, height, Path.Direction.CCW);
        return;
    }

    // Top left circle
    oval.set(0, 0, 2 * topLeftRadius, 2 * topLeftRadius);
    borderPath.moveTo(0, topLeftRadius);
    borderPath.arcTo(oval, 180, -90);

    borderPath.rLineTo(width - topLeftRadius - topRightRadius, 0);

    // Top right circle
    oval.set(width - 2 * topRightRadius, 0, width, 2 * topRightRadius);
    borderPath.arcTo(oval, 90, -90);

    borderPath.rLineTo(0, height - topRightRadius - bottomRightRadius);

    // Bottom right circle
    oval.set(width - 2 * bottomRightRadius, height - 2 * bottomRightRadius, width, height);
    borderPath.arcTo(oval, 0, -90);

    borderPath.rLineTo(-width + bottomRightRadius + bottomLeftRadius, 0);

    // Bottom left circle
    oval.set(0, height - 2 * bottomLeftRadius, 2 * bottomLeftRadius, height);
    borderPath.arcTo(oval, -90, -90);

    borderPath.rLineTo(0, -height + bottomLeftRadius + topLeftRadius);
}

当我运行它时,我得到了java.lang.IllegalArgumentException: path must be convex我无法进入native_isConvex()看看它如何决定路径是否是凸的。

那么什么是凸路径呢?为什么路径在congfigurePath()不是凸的吗? 如何创建自定义凸路径?谢谢。


我自己想出来了。该路径不是凸的,因为我没有正确绘制路径。实现我想要的多圆角半径效果的正确路径应该是:

    // Top left circle
    oval.set(0, 0, 2 * topLeftRadius, 2 * topLeftRadius);
    borderPath.moveTo(0, topLeftRadius);
    borderPath.arcTo(oval, -180, 90);

    borderPath.rLineTo(width - topLeftRadius - topRightRadius, 0);

    // Top right circle
    oval.set(width - 2 * topRightRadius, 0, width, 2 * topRightRadius);
    borderPath.arcTo(oval, -90, 90);

    borderPath.rLineTo(0, height - topRightRadius - bottomRightRadius);

    // Bottom right circle
    oval.set(width - 2 * bottomRightRadius, height - 2 * bottomRightRadius, width, height);
    borderPath.arcTo(oval, 0, 90);

    borderPath.rLineTo(-width + bottomRightRadius + bottomLeftRadius, 0);

    // Bottom left circle
    oval.set(0, height - 2 * bottomLeftRadius, 2 * bottomLeftRadius, height);
    borderPath.arcTo(oval, 90, 90);

    borderPath.rLineTo(0, -height + bottomLeftRadius + topLeftRadius);

更新:虽然现在路径是正确的,但它仍然不是凸路径,似乎自定义路径不会被视为凸路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建自定义凸路径Android 的相关文章

  • Android ListView 子项

    我最近为 Android 应用程序创建了一个新的 ListView 对象 但遇到了一些错误 当我尝试使用简单适配器创建一个包含列表中子项目的项目时 创建的最新项目与其他项目重叠 我正在使用地图列表来创建项目 例如 如果我向地图列表中添加一个
  • 如何检测 Android 设备中的新应用

    我想检测用户何时安装或删除应用程序 但没有找到BroadcastReceiver就是这样做的 在我的应用程序中 我获取了有关该类已安装应用程序的信息PackageManager 但我不想定期扫描应用程序 有没有BroadcastReceiv
  • tns run android --emulator 不工作 - NativeScript

    我已按照此步骤操作link http docs nativescript org tutorial chapter 1 当我使用命令运行时tns run android emulator 我在命令提示符中收到以下错误 Configuring
  • Android - SimpleCursorAdapter 是否允许像 BaseAdapter 一样的多种布局?

    我知道你可以创建一个自定义Adapter延伸BaseAdapter并创建各种布局 这些布局可以根据哪一行进行扩展AdapterView is at 但是有没有什么方法可以通过SimpleCursorAdapter 例如 我有一个数据库 我想
  • android/eclipse 中的网络服务

    我需要通过soap 方法使用android eclipse 的Web 服务 即 我必须提供输入并根据用户输入从网络服务显示适当的结果 如何做到这一点 java类 public class Demo webserviceActivity ex
  • 使用 Firebase Java API 检索/格式化数据的最佳方式

    我在用着Firebase用于数据存储Android项目 并使用Firebase Java API来处理数据 不过 我不确定我是否尽可能高效地完成此操作 并且我希望获得一些有关检索和格式化数据的最佳实践的建议 我的Firebase存储库看起来
  • firebase android 基于类的更新不尊重字段名称的大小写

    我声明了以下类 注意大小写选择 public class User private String DisplayName private Boolean Proxy false SuppressWarnings unused public
  • 如何将字节数组转换为图像 [kotlin]

    我想将字节数组转换为图像并在图像视图中显示它 但不知道该怎么做 有人可以指导我吗 我使用这个函数将位图转换为字节数组 private fun BitmapToByteArray ByteArray val stream ByteArrayO
  • Android Studio 3.2.1 升级后构建错误

    我正在从 Udacity 构建一个示例项目 到目前为止 一切正常 但升级到 Android Studio 3 2 1 后 我遇到了下面的构建错误 摇篮版本 4 6 项目链接 https github com udacity ud851 Su
  • Eclipse Android 不会清理,不会刷新资源

    我升级到Ubuntu 11 10 Eclipse 3 7 0 ADT 14 0 0 当我替换桌面上 res drawable nodpi 目录中的图片资源或 res raw 目录中的声音资源时 重新编译的程序和 Project Explor
  • 如何加密和解密Android SD卡中的文件夹

    是否可以加密 SD 卡文件夹 请帮助我 如果可以的话 加密和解密的处理器是什么 不可能 让我知道我可以为 android SDcard 中的文件夹安全做些什么 我的文件在这里 mnt sdcard image1 jpeg 那么如何在andr
  • Android mediacontroller 播放暂停控件无法正确刷新

    我在我的活动中使用了 MediaController 它工作正常 但是当我第一次播放视频时 应该有 b 可见的暂停按钮 但相反 有播放 当我按下该按钮时 视频会正确暂停 状态保持不变 之后它工作正常 视频完成时也会发生同样的事情 这是一个错
  • 将项目导入 Eclipse 后出现“必须重写超类方法”错误

    任何时候我必须将我的项目重新导入到 Eclipse 中 如果我重新安装了 Eclipse 或者更改了项目的位置 几乎全部我的重写方法的格式不正确 导致错误 该方法必须重写超类方法 值得注意的是 无论出于何种原因 Android 项目中方法参
  • 当键盘出现时滚动布局

    当键盘出现并隐藏工具栏 FrameLayout 时 我的屏幕大小调整到顶部 我只需将聊天项目滚动到顶部并将框架布局保持在顶部 我尝试了谷歌和SO的一些例子 但对我没有任何帮助
  • Android ViewPager - 在左侧和右侧显示页面预览

    我用的是安卓系统ViewPager 我想要做的是在左侧和右侧显示页面的预览 我已经知道在哪里可以使用否定pageMargin显示右侧的预览 setPageMargin 100 无论如何 我也可以显示左侧的预览吗 它基本上类似于我正在寻找的画
  • RecyclerView:禁用焦点变化引起的滚动

    TL DR我有一个RecyclerView of EditTexts 当用户注意力集中时EditText 1并点击EditText 2 我想EditText 2获得焦点 但我不想要ReyclerView滚动 我怎样才能实现这个目标 我正在尝
  • Gerrit/repo 遇到“error.GitError:远程没有评论 url”

    我正在尝试在一家封闭的商店中为 Android 开发设置 Gerrit 和存储库 我在安装 Gerrit 服务器时遇到了很少的问题 但我在客户端工作站上收到此错误 repo start Falk vi AndroidManifest xml
  • 为什么在 this 方法中添加 If 语句会大大降低速度?

    我在中遇到过这个回答另一个问题 https stackoverflow com questions 12233594 faster way to apply alpha to a jpeg in an android app 我试图诊断哪些
  • 无法在 MARSHAMALLOW 文件选择器中选择 pdf、doc、ppt 等文件

    我正在使用我的 Android 应用程序将 pdf ppt doc 等文件上传到服务器 但在 Marshmallow 中 当文件选择器打开并且我浏览我的 Sdcard 或内部存储时 存在两个问题 1 它显示了所有我无法选择的文件 例如图像
  • 检查用户是否已经使用Auth.GoogleSignInApi登录?

    我发现为了登录用户 我必须使用以下代码 Intent signInIntent Auth GoogleSignInApi getSignInIntent mGoogleApiClient startActivityForResult sig

随机推荐

  • 如何在 centos 7 上链接 python3 以使用 openssl11/或最新版本的 openssl (1.1.1)

    我们想在centos 7中升级OpenSSL但没有成功 原因可能是这样的 通过 yum install openssl11 将 CentOS 7 升级到 OpenSSL 1 1 1 https stackoverflow com quest
  • Memcached 块限制

    为什么有硬编码的块限制 压缩后 0 5 兆 内存缓存 http memcached org 有人重新编译过它吗 我知道我不应该发送这样的大块 但这些额外的重块时不时地发生在我身上并造成严重破坏 这个问题曾经在官方常见问题解答 http co
  • AWS ALB 中基于路径的路由到具有多个端口的单个主机

    我想创建一个 ALB 它应该根据到不同网站的路径路由我的流量 例如 example com apple 应该转到 8080 example com grapes 应该转到 8180 example com oranges 应转到 8280
  • Rails 4 simple_form has_many 通过复选框不保存

    我正在尝试使用 simple form 通过复选框来实现员工经常性扣除表 我的代码有效 但所选的经常性扣除未保存在我的表中 我不明白为什么 这是我的模型 class Employee lt ActiveRecord Base belongs
  • 使用 maven-nar-plugin 在 Maven 中构建 C++ 项目

    有人使用 maven nar plugin 为不同平台 使用不同编译器构建 C 代码吗 如果有人请给我更多有关此的信息 我只是想知道如何使用 Maven 为不同平台构建 NAR 文件 我知道 为了能够在特定平台上构建项目 您应该在该平台上运
  • 在 Azure Functions 项目(.NET 标准 2.0)本地中找不到工作职能

    我正在尝试在 NET 标准 2 0 中创建一个 Azure Functions 项目 因为我需要在该项目中使用 NET 标准 2 0 类库 但是 当我尝试创建一个简单的 Azure Functions 项目并在本地运行它时 出现以下错误 h
  • em 中的媒体查询不受基本字体大小的影响

    我试图理解为什么设置不同的基本字体大小不会影响媒体查询的 EM 值 它们的默认基本字体大小为 16px 而其余内容反应正常 自己尝试一下 PX 中的媒体查询 https jsfiddle net sebtp n8x0tuvq 5 https
  • 输出导致与正则表达式不匹配的第一个字符

    是否可以输出导致与正则表达式不匹配的字符串 其索引 中的第一个字符 是否可以仅使用正则表达式匹配操作 或者必须使用更复杂的操作 例如 在 JavaScript 中 我可能有一个正则表达式 d 3 s d 2 匹配包含 3 位数字后跟空格和另
  • Android 中使用 xml 自定义形状

    我正在尝试绘制一个自定义形状 可以将其用作布局的背景 但我不能这样做 是否可以使用 android xml 中的 xml 绘制如下形状 我不知道如何从矩形的垂直中心切割半圆形 Use layer list制作这个自定义形状drawable
  • 无序对集合,编译错误

    我正在尝试创建一组无序的对 到目前为止我有 typedef std pair
  • 如何为子域配置 Facebook 应用程序

    我正在构建一个多租户应用程序 并且我挣扎将 Facebook 登录合并到 Web 应用程序中 例如 租户正在使用子域 http tenant 1 domain com http tenant 2 domain com http tenant
  • 如何识别STATUS_INVALID_CRUNTIME_PARAMETER异常

    平台是Windows 7 SP1 我最近花了一些时间调试由于代码将无效参数传递给 安全 CRT 函数之一而引起的问题 结果 我的应用程序立即中止 没有任何警告或任何内容 甚至没有崩溃对话框 起初 我尝试通过将 Windbg 附加到我的应用程
  • Chrome 浏览器 61v。单击可见区域之外的元素时出现问题

    当我将 Chrome 浏览器更新到 61v 时 单击可见区域之外的不可见元素会出现问题 早些时候它起作用了 尝试点击可见区域之外的链接 element Click 有 InvalidOperationException 元素在点 1134
  • 如何使信号 NaN 易于使用?

    IEEE754 标准定义了两类 NaN 安静 NaN QNaN 和信令 NaN SNaN 当 SNaN 加载到浮点寄存器时 浮点单元会引发异常 QNaN 可通过名为的常量用于 Delphi 代码NaN声明于Math 该常数的定义是 cons
  • Hibernate c3p0 连接池未超时空闲连接

    我们有一个 java 服务器连接到 MySQL 5 数据库 使用 Hibernate 作为持久层 该持久层使用 c3p0 进行数据库连接池 我尝试遵循 c3p0 和 hibernate 文档 Hibernate 如何配置 c3p0 连接池
  • 通过 Chrome 扩展模拟点击页面上的元素?

    我需要迭代并单击该类的所有元素 star gray在页面上 并在重定向后保持迭代和单击 运行JavaScript代码无法满足第二个要求 所以我打算写一个Chrome扩展 但我未能通过扩展模拟网页上的点击事件 我的项目如下 清单 json m
  • 从 GitHub 进行 Git 克隆后,我看不到我的分支

    我在 GitHub 上有一个存储库 它包含master和一个分支 当我克隆它时 我只获得master并没有看到我的分支 为什么会这样呢 如何查看存储库中的所有分支 默认情况下 git clone只创建一个分支 当前签出的分支 通常是 mas
  • 控制台窗口立即消失[重复]

    这个问题在这里已经有答案了 使用 C 的 Visual Studio 中的控制台窗口不稳定 ReadLine 也不工作 窗口立即消失 我看不到结果 您需要在代码后添加以下行 Console ReadKey 这将阻止控制台执行下一行 直到您按
  • 如何监控 OmniThreadLibrary 中的 Pipeline 阶段?

    是否可以以某种方式监控管道任务 我尝试像这样向每个任务添加监视器 FPipeline Parallel Pipeline Stage StageWorker1 Parallel TaskConfig MonitorWith MyMonito
  • 创建自定义凸路径Android

    我希望为我的框架布局设置一个自定义形状 矩形每个角的不同半径 以便框架布局中的视图将剪辑到形状的边界 ViewOutlineProvider provider new ViewOutlineProvider Override public