使用canvas.drawRoundRect()时,解决四个圆角的线比较粗的问题-程序员宅基地

技术标签: canvas  圆角矩形  android  drawRoundRect  android开发笔记  

    最近在使用 drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 画圆角矩形时,四个圆角的线总是比四条边的线更粗,看起来相当难看。

    如下图:


    画图的代码片段如下。

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int width = getWidth();
    int height = getHeight();

    mPaint.setColor(Color.BLUE);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(5);
    canvas.drawRoundRect(0, 0, width, height, 20, 20, mPaint);
}
    为啥会这样呢。试图查看源码,发现该方法的实现是利用JNI调用的本地方法。只能自己闷头调试,终于。。。

    其实,不是圆角的线粗了,而是四条边的线变细了。what ?

    圆角矩形应该是基于矩形绘制的,当 mPaint.setStrokeWidth(5) 设置线宽为5,那么矩形的左上角的外边是从 (-2.5,-2.5)开始,内角是从(2.5,2.5)开始,加起来线宽是5。

    但是画布Canvas是从(0,0)开始显示的,所以四条边的外面一半就被截掉显示不了了。如下图。所以其实一般情况下,我们画出来的矩形的线宽只有我们 setStrokeWidth设置的一半宽。


    当形状是圆角矩形时,四个角缩进去了,所以圆角上的弧线没有被截掉一半,是我们setStrokeWidth 时的真正线宽。导致圆角上的线看起来特别粗。

    找到原因,就easy了,在绘制圆角矩形时,往里缩一点,不要让四条边被截掉一半就可以了。

代码如下,绘制时,调整下点的参数

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int width = getWidth();
    int height = getHeight();

    mPaint.setColor(Color.BLUE);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(5);
    canvas.drawRoundRect(2.5f, 2.5f, width-2.5f, height-2.5f, 20, 20, mPaint);
}

    这样显示出来的圆角矩形看起来就舒服多了



    over,over!!!

    个人小见解,如有问题烦请指出!!!


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kuaiguixs/article/details/78753149

智能推荐

BIOS追code之PEI phase_pei阶段-程序员宅基地

文章浏览阅读7k次,点赞13次,收藏38次。SEC 阶段总述PEI阶段的功能任务:PEI划分:PEI阶段执行流程:PEI阶段执行流程描述及流程图阶段总述PEI(Pre-EFI Initialization,预先EFI初始化),虽然SEC阶段对CPU和CPU内的资源进行了初始化,但是PEI阶段可用的资源依旧十分有限,该阶段对内存进行初始化,主要功能是为DXE阶段准备执行环境,将所需要传递给DXE的信息组成HOB(Hand Off Block)列表,最终将控制权转交到DXE。UEFI具有模块化设计的特点,PEI就是一个模块。PEI Image的入口_pei阶段

介绍个好用的内网穿透工具:nps-程序员宅基地

文章浏览阅读6.4k次,点赞2次,收藏15次。最早开始接触内网穿透,是在调试微信支付的时候,微信需要回调一个公网地址,经过一番搜索,我选用了 natapp,优点是有免费隧道,缺点是公网域名和端口是随机分配的,偶尔调试用下还可以。后来,因为要映射公司和家里 Windows 远程连接的端口,natapp 那种随机域名和端口的服务,不满足我的需求。这时 frp 出现在可选列表里,只需要一台公网服务器,就可以搭建,通过服务端和客...

Check failed: status == CUDNN_STATUS_SUCCESS(4 vs. 0) 等总结-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏7次。解决了一个问题,然后不总结不做笔记,下次遇到还是要从头做起,费时费力,要养成总结的习惯。这两天晚上在自动化学院帮基友爬坑,之前自己复现的时候,没遇到过,换个环境又出现了各种问题,写个博客记录一下。 在ubuntu下,这种右下角有黑色箭头的文件夹 理解为 类似 Windows系统下的快捷方式。你用 ls -l 文件夹名可以看到如下图:也就是说 cuda 这个文件夹实际上指..._status_success

unp.h网络运行环境搭建_c语言unp.h-程序员宅基地

文章浏览阅读684次。unp.h的安装以及第一个程序的运行源代码下载以及编译点击此处下载源代码解压到本地文件夹,如果访问不了GitHub的话就用我搬到gitee的仓库吧git clone https://gitee.com/Find-ing/unpv13e.git直接这样就不用解压了这里可以看看README按照README上的顺序首先执行./configure然后cd libmakecd ../libfreemakecd ../libroutemake如果出现了错误,就再来一次cd ._c语言unp.h

2018_1_21_Pascal Library_矩阵遍历-程序员宅基地

文章浏览阅读309次。Pascal LibraryTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6384 Accepted: 2957DescriptionPascal University, one of the oldest in the country, needs to _pascal library

Helm v3概念和常用命令详述_helmv2和v3版本对比-程序员宅基地

文章浏览阅读4.8k次,点赞10次,收藏22次。Helm v3概念ChartHelm的应用包,采用tgz格式。类似于Yum的RPM包,其包含了一组定义Kubernetes资源相关的YAML文件。也称为应用Chart。RepoistoryHelm的应用仓库,Repository本质上是一个Web服务器,该服务器保存了一系列的Chart应用包以供用户下载,并且提供了一个该Repository的Chart包的清单文件以供查询。Helm可以同时..._helmv2和v3版本对比

随便推点

OracleOraDb10g_home1TNSListener 服务消失的解决方法-程序员宅基地

文章浏览阅读1.5k次。“OracleOraDb10g_home1TNSListener” 服务 突然不见了 解决办法:cmd中输入 lsnrctl start 随后提示: .................... 在服务里OracleOraDb10g_homelTNSListener就可以出现了 PS:lsnrctl :oracle 监听器开启关闭指令..._oracle10 没有tnslistener

IntelliJ IDEA 的 JDK在哪?_idea自带的jdk在哪个文件-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏5次。文章目录IntelliJ IDEA 的 JDK在哪?IntelliJ IDEA 的 JDK在哪?我安装了IntelliJ IDEA Community Edition 2019.2它估计是JetBrains这个公司产的 java的位置是:D:\software\JetBrains\IntelliJ IDEA Community Edition 2019.2.1\jbr\bin呦呦呦,牛逼哦! 那我试试一下hello worldclass1.javapublic _idea自带的jdk在哪个文件

PHP 创建目录时抛错,Warning: mkdir(): Permission denied in xxx.php on line 45的解决办法_warning: mkdir(): permission denied in-程序员宅基地

文章浏览阅读4k次。如下,PHP 创建目录时抛错,Warning: mkdir(): Permission denied in aerchi_file_upload_parser.php on line 45$cur_root_upload_path = $_SERVER['DOCUMENT_ROOT']."/aerchi/upload-2019/";//创建目录失败if (!file_exists($..._warning: mkdir(): permission denied in

Minecraft成人类和AI协同工作的试验之地_project malmo 开源 github-程序员宅基地

文章浏览阅读880次。微软的Project Malmo项目开始于2015年6月份,其前身为Project AIX,该项目是基于Minecraft的一个成熟的AI实验平台,旨在支持人工智能领域的基础研究工作。Project Malmo平台由两个部分组成:Java版的游戏模组和帮助AI智能体感知和行动的代码。这两个部分都可以在Windows、Linux或者 Mac OS环境下运行,研究人员可以使用任何一种语言来对其中的AI_project malmo 开源 github

[C] 深度优先搜索解决连通块/染色问题——求岛的个数_岛屿 染色问题-程序员宅基地

文章浏览阅读530次。本文介绍用DFS解决连通块个数问题有关dfs的介绍见另外一篇:不撞南墙不回头——深度优先搜索例题宝岛探险题目描述一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示海拔,0表示海洋,1~9表示陆地。探险家乘坐飞机降落在(6,8)处,现在需要统计探险家降落的地图的小岛数量,我们将探险家降落点上下左右相连接的陆地视作同一个岛屿。本文介绍DFS的解法,如果想了解用BFS解最大连通面积,看另一篇文章:层层递进——C语言实现广度优先搜索测试样例:10 10 6 8_岛屿 染色问题

file_get_contents引起的网站加载速度变慢_file_get_contents 阿里云慢,腾讯云块-程序员宅基地

文章浏览阅读1.6k次。file_get_contents函数,我们的网站需要引入另一个网站的一部分文章,做一部分栏目新闻,所以我们用了file_get_contetnts()函数通过url引过来内容,然后通过正则匹配preg_match()出我们想要的内容,然后显示到我们的网站过来,然而这个函数并没有把内容给引进过来,我们的网站加载的加载速度变慢了,当我把这个函数删掉以后,网站的进入速度变快了,所以还是尽量不要从别的网_file_get_contents 阿里云慢,腾讯云块